dbg修改EIP动调 [BJDCTF 2020]Easy
教程多是patching,但是我下载错误(以后有时间再试试),那用dbg吧
还有这道题蜜汁让我幻视pwn
题目
Die
IDA
主函数很好找,代码只是输出提示,没有其他东西了
关键函数在其他地方
看看左边函数框
发现在main函数前面有一个名字一看就是自定义的函数ques
这个函数在main函数之前运行
1 int ques() 2 { 3 int v0; // edx 4 int result; // eax 5 int v2[50]; // [esp+20h] [ebp-128h] BYREF 6 int v3; // [esp+E8h] [ebp-60h] 7 int v4[10]; // [esp+ECh] [ebp-5Ch] 8 int j; // [esp+114h] [ebp-34h] 9 __int64 v6; // [esp+118h] [ebp-30h] 10 int v7; // [esp+124h] [ebp-24h] 11 int v8; // [esp+128h] [ebp-20h] 12 int i; // [esp+12Ch] [ebp-1Ch] 13 14 v3 = 2147122737; 15 v4[0] = 140540; 16 v4[1] = -2008399303; 17 v4[2] = 141956; 18 v4[3] = 139457077; 19 v4[4] = 262023; 20 v4[5] = -2008923597; 21 v4[6] = 143749; 22 v4[7] = 2118271985; 23 v4[8] = 143868; 24 for ( i = 0; i <= 4; ++i ) 25 { 26 memset(v2, 0, sizeof(v2)); 27 v8 = 0; 28 v7 = 0; 29 v0 = v4[2 * i]; 30 LODWORD(v6) = *(&v3 + 2 * i); //v6的低位来源 31 HIDWORD(v6) = v0; //v6的高位来源 32 while ( v6 > 0 ) 33 { 34 v2[v8++] = v6 % 2; 35 v6 /= 2LL; 36 } 37 for ( j = 50; j >= 0; --j ) 38 { 39 if ( v2[j] ) 40 { 41 if ( v2[j] == 1 ) 42 { 43 putchar('*'); //打印* 44 ++v7; 45 } 46 } 47 else 48 { 49 putchar(' '); //打印空格 50 ++v7; 51 } 52 if ( !(v7 % 5) ) 53 putchar(' '); //打印空格 54 } 55 result = putchar('\n'); 56 } 57 return result; 58 }
看来这就是我们需要的关键函数
代码作用:打印了一些东西在控制台上,调试一下看看
32Xdbg
调试之前,我们需要得到一些地址信息
main函数结束位置 00401773
ques函数开始位置 00401520
ques函数结束位置,即打印结束位置 00401724
逻辑:在运行到mian函数结尾时,修改EIP指向que函数的入口位置,最后在que函数结束的位置下一个断点,方便我们F9直接运行到结束查看打印结果
F9
此时查看控制台
flag
NSSCTF{HACKIT4FUN}