buuoj-[Zer0pts2020]easy strcmp
1.无壳
2.打开直奔main函数
啊,又是签到题吗?
交上去,不对。。。
然后开始一顿乱翻
这个看起来很可疑
查一下谁调用了这个函数,结果
又是一顿乱翻,从程序入口找到了这个:
一顿瞎点,找到:
off_201028 = sub_6EA,原来是间接调用,怪不得之前找不到
上面这个也留意一下,qword_201090就是strcmp函数
注意原strcmp这里:
双击,查看汇编代码,是跳转到off_201028,也就是 sub_6EA,所以这里的strcmp其实是 sub_6EA
查看sub_6EA,最后面有一个:
上面说了,qword_201090就是strcmp函数
也就是说,假的strcmp把flag放入了sub_6EA,然后一顿操作完成后,才调用了strcmp,也就是flag一顿操作完成后,变成了
那我们就看一看具体是什么操作就好了:
注意给的数据以小端序的形式存储,不过shift+e提取也不需要考虑这个问题,ida帮你做了
写个脚本加回去就得到flag了
data='zer0pts{********CENSORED********}'
data2=[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x09,
0x4A, 0x49, 0x35, 0x43, 0x0A, 0x41, 0xF0, 0x19, 0xE6, 0x0B,
0xF5, 0xF2, 0x0E, 0x0B, 0x2B, 0x28, 0x35, 0x4A, 0x06, 0x3A,
0x0A, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
for i in range(len(data)):
tem=ord(data[i])+data2[i]
print(chr((tem)),end='')
得到:zer0pts{l3ts_m4kijĴńńSOUR_t0d4y}
乍一看是对的,但是不对。。
去看了一下大佬的博客
多者溢出。。
那就改一下脚本
data='zer0pts{********CENSORED********}'
data2=[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x09,
0x4A, 0x49, 0x35, 0x43, 0x0A, 0x41, 0xF0, 0x19, 0xE6, 0x0B,
0xF5, 0xF2, 0x0E, 0x0B, 0x2B, 0x28, 0x35, 0x4A, 0x06, 0x3A,
0x0A, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
for i in range(len(data)):
tem=(ord(data[i])+data2[i])&0xff
print(chr((tem)),end='')
得到了:zer0pts{l3ts_m4k34DDSOUR_t0d4y}
还是不对,又去翻了好久博客,正确flag是:zer0pts{l3ts_m4k3_4_DDSOUR_t0d4y}
差了一点点:
是什么导致缺了1呢。。
想了好久,突然意识到 不会是上一字节溢出的给了下一位吧
然后改了一下脚本
data='zer0pts{********CENSORED********}'
data2=[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x09,
0x4A, 0x49, 0x35, 0x43, 0x0A, 0x41, 0xF0, 0x19, 0xE6, 0x0B,
0xF5, 0xF2, 0x0E, 0x0B, 0x2B, 0x28, 0x35, 0x4A, 0x06, 0x3A,
0x0A, 0x4F, 0x00]
f=0
for i in range(len(data)):
if f!=0:
tem = ord(data[i]) + data2[i]+f
f=0
else:
tem=ord(data[i])+data2[i]
if tem>0xff:
f=1
tem&=0xff
print(chr((tem)),end='')
得到
zer0pts{l3ts_m4k3_4_DETOUR_t0d4y}