首页
社区
课程
招聘
[原创]BUUCTF逆向题:[Zer0pts2020]easy strcmp
2022-3-27 17:39 4741

[原创]BUUCTF逆向题:[Zer0pts2020]easy strcmp

2022-3-27 17:39
4741

1.基本信息探查:

1.EXEinfo:

2.运行一下:

2.IDA分析:

1.主函数分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
__int64 __fastcall main(int a1, char **a2, char **a3)
{
  if ( a1 > 1 )
  {
    if ( !strcmp(a2[1], "zer0pts{********CENSORED********}") )
      puts("Correct!");
    else
      puts("Wrong!");
  }
  else
  {
    printf("Usage: %s <FLAG>\n", *a2);
  }
  return 0LL;
}

a2为输入的flag与右边这个值比对,一开始还以为和上题一样是直接提交flag,但是提交后发现失败; 看来没这么简单,但是单看主函数也没发现什么异常,之前做过一些题在init函数动过手脚(init里面调用函数改码表),这里同样先看一下边上的函数,发现sub_6EA函数调用了字符串:

2.sub_6EA函数分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
__int64 __fastcall sub_6EA(__int64 a1, __int64 a2)
{
  int i; // [rsp+18h] [rbp-8h]
  int v4; // [rsp+18h] [rbp-8h]
  int j; // [rsp+1Ch] [rbp-4h]
 
  for ( i = 0; *(_BYTE *)(i + a1); ++i ) //相当于求串长,串长放在了i里面
    ;
  v4 = (i >> 3) + 1;              //v4 = 5
  for ( j = 0; j < v4; ++j )       //相当于分成5块来计算,一块8个字符
    *(_QWORD *)(8 * j + a1) -= qword_201060[j];
  return qword_201090(a1, a2);
}

基本逻辑就是将输入以8个字符为一组分割,分别减去qword_201060的值,跟一下qword_201060的值:

 

 

shift+E提取:(我们只要用这些)

1
42094A4935430A41,F019E60BF5F20E0B,2B28354A063A0A4F

exp:

1
2
3
4
5
6
7
8
9
10
11
12
rflag = "********CENSORED********"
m = [0x410A4335494A0942, 0x0B0EF2F50BE619F0, 0x4F0A3A064A35282B]
 
import binascii
 
flag = b''
for i in range(3):
    p = rflag[i*8:(i+1)*8]
    a = binascii.b2a_hex(p.encode('ascii')[::-1])
    b = binascii.a2b_hex(hex(int(a,16) + m[i])[2:])[::-1]
    flag += b
print (flag)

 

flag{l3ts_m4k3_4_DETOUR_t0d4y}


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回