青少年CTF论坛»论坛 CTF Reverse 查看内容

0 评论

0 收藏

分享

由一道题想到的REV做法

https://qsnctf.com/challenges#babyUPX-328
0x00: 先吐槽下这道题。
1. 依赖MinGW环境,查了半天用了一个MinGW装的MSYS环境
2. 只要输入flag的前缀就能过
比如,
  1. $ babyUPX.exe
  2. SICTF
  3. Congratulations!
复制代码
所以,我们可以一位一位试(我现在还不清楚算法细节)
0x01: 脱壳
upx -d会提示文件损坏,因为UPX!标识被隐去,如图

把_改为U即可使用upx -d正常脱壳
0x02:简单逆向
直接跳到main

有个跳转好奇怪诶,字符串长度为0直接过?
看个伪码
  1. extern unsigned int g_405200[4];
  2. extern unsigned int g_408020;

  3. int sub_401594(unsigned int v5, unsigned int a0)
  4. {
  5.     char v0;  // [bp-0x29]
  6.     void* v1;  // [bp-0x28]
  7.     unsigned int v2;  // [bp-0x24]
  8.     unsigned int v3;  // [bp-0x18]
  9.     void* v4;  // [bp-0x14]

  10.     sub_401c60();
  11.     gets(&g_408020);
  12.     v3 = strlen(&g_408020);
  13.     for (v4 = 0; v4 < v3; v4 += 1)
  14.     {
  15.         v1 = v4;
  16.         v2 = v1 >> 31;
  17.         v0 = *((char *)(v4 + &g_408020));
  18.         if (!sub_401504(sub_401564(sub_401410(v0, v0 >> 31, *((int *)(0x4 * v4 + (char *)&g_405200[0])), *((int *)(0x4 * v4 + (char *)&g_405200[0])) >> 31), v0 >> 31, v1, v2), v0 >> 31, v4, v4 >> 31) && !v0 >> 31)
  19.         {
  20.             printf("Worry!");
  21.             exit(0); /* do not return */
  22.         }
  23.     }
  24.     printf("Congratulations!");
  25.     return 0;
  26. }
复制代码
很明显了 逐字节比较,且没有比较字符串长度之类的,这导致了bug2
所以,我们有如下代码
  1. import os,time,subprocess
  2. flag='SICTF{ ' # 保留空格占位
  3. alpha='1234567890-=~!@#$%^*_+qwertyuiopQWERTYUIOPasdfghjklASDFGHJKL:zxcvbnm,./ZXCVBNM?'
  4. while 1:
  5.     for i in alpha:
  6.         _flag=list(flag) # 转为list修改最后一位
  7.         _flag[-1]=i
  8.         flag=''.join(_flag)
  9.         print('\r'+flag, end='') # 打印正在破解的flag(多酷啊)
  10.         with open('tmp.sh','w+') as f:  # 最开始的版本有bug,现在似乎没必要了
  11.             f.write(" echo "+flag+" | babyUPX.exe")
  12.         f=os.popen("sh tmp.sh")
  13.         time.sleep(0.001) #给点反应时间
  14.         ret=f.read()
  15.         if 'Cong' in ret:
  16.             break # 这一字节破解成功
  17.         f.close()
  18.     flag=flag+' ' # 保留空格占位
复制代码
0x03:结语
以后遇到类似的逐字节比较的题但又没有bug,能不能通过一些patch逐字节爆破呢?


回复

举报 使用道具

全部回复
暂无回帖,快来参与回复吧
huolongguo10
新手上路
主题 0
回复 0
粉丝 0
快速回复 返回顶部 返回列表