buuctf.pwn.pwn1_sctf_2016

发布时间 2023-03-28 18:15:11作者: redqx

首先,一些准备操作就不做了
然后拖入IDA分析
发现是恶心的C++代码

关于replace(sz_ret, &input, sz_I)反编译问题
1),该replace不是std:string:replace,chatgpt告诉我的
2),如何反编译出3个参数? 从IDA进入replace函数,然后F5刷新一下,就可以重新反汇编出3个参数的replace
3),关于repalce的函数功能,大概功能就是字符串的替换,具体的功能chatgpt会告诉你,最后的效果可以通过IDA的调试看出,该函数的作用是把字符串出现的'I'替换为'You'

关于输入进入缓冲区,他有一个截断的操作,所以你无法直接把输入溢出到返回函数的[ebp+4]
但是好消息是,他的字符串替换函数可以实现输入长度的增倍,而且输入的字符串放在了栈stack里面,而不是堆heap里面,所以是可以通过字符串的变长,溢出到[ebp+4]
同时还得满足输入字节不能大于30

char s[32]; // [ebp-3Ch] BYREF
rip [ebp+ 4]
间距=0x3c+4=64
所以大概写入64/3=21字节,然后在写入1字节,满足21*3+1=64字节,然后再写入我们要覆盖的地址4字节
所以我们原来写入的是23个'I'+1个填充字符+4字节覆盖地址=28字节<30字节,满足情况
所以exp如下