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}

posted @ 2024-06-02 21:49  demo41  阅读(8)  评论(0编辑  收藏  举报