25.8.29_NSSCTF——[BJDCTF 2020]Easy_WP
NSSCTF——[BJDCTF 2020]Easy_WP
一、做题过程
这道题考的是动调,我之前没怎么做过动调的题,所以借鉴了很多大佬的文章
首先是看了ida调试技巧-通过修改eip寄存器的值强制运行程序中存在但未被调用的函数_ida运行程序-CSDN博客,了解了如何在ida运行时通过修改EIP(可以理解为指针)来运行原来不能运行的函数
看题,32位,无壳:
打开后直奔main函数,发现啥也没有:
在左侧的函数窗口可以看到一个_ques函数:
int ques()
{int v0; // edxint result; // eax_DWORD buf[50]; // [esp+20h] [ebp-128h] BYREFint n2147122737; // [esp+E8h] [ebp-60h]_DWORD v4[10]; // [esp+ECh] [ebp-5Ch]int j; // [esp+114h] [ebp-34h]__int64 v6; // [esp+118h] [ebp-30h]int v7; // [esp+124h] [ebp-24h]int v8; // [esp+128h] [ebp-20h]int i; // [esp+12Ch] [ebp-1Ch]n2147122737 = 2147122737;v4[0] = 140540;v4[1] = -2008399303;v4[2] = 141956;v4[3] = 139457077;v4[4] = 262023;v4[5] = -2008923597;v4[6] = 143749;v4[7] = 2118271985;v4[8] = 143868;for ( i = 0; i <= 4; ++i ){memset(buf, 0, sizeof(buf));v8 = 0;v7 = 0;v0 = v4[2 * i];LODWORD(v6) = v4[2 * i - 1];HIDWORD(v6) = v0;while ( v6 > 0 ){buf[v8++] = v6 % 2;v6 /= 2LL;}for ( j = 50; j >= 0; --j ){if ( buf[j] ){if ( buf[j] == 1 ){putchar(42);++v7;}}else{putchar(32);++v7;}if ( !(v7 % 5) )putchar(32);}result = putchar(10);}return result;
}
这里putchar了很多字符,flag多半就在这里
现在开始动调改EIP,首先找到main函数的结尾,也就是return那里的地址,下断点:
然后左上角Debugger->switch debugger->local windows debbugger,然后F9开始动调
注意这个cmd界面需要回车一下
然后右上角找到EIP并双击,修改为_ques函数的开始地址0x00401520
这样我们就进入了ques函数,这里继续运行程序就可以在cmd界面找到打印出来的字符了
这里最开始我是一直F7,发现需要按好久,于是我搜了一下,看了这篇文章IDA 快捷键基本使用(常用+动调快捷键)_ida快捷键-CSDN博客,这里直接ctrl+F7自动运行就可以了,得到flag:
Get_flag:NSSCTF{HACKIT4FUN}
二、需要注意的
动运行就可以了,得到flag:
[外链图片转存中…(img-NGXfjr29-1756479480948)]
Get_flag:NSSCTF{HACKIT4FUN}
二、需要注意的
- ida中通过动调修改EIP运行没有运行的函数