首页
社区
课程
招聘
[原创]蒸米ROP level 4 - 使用ROPgadget寻找gadgets
发表于: 2024-5-9 13:06 6790

[原创]蒸米ROP level 4 - 使用ROPgadget寻找gadgets

2024-5-9 13:06
6790

ubuntu1~16.04.12
pwndbg
python

学习x86和x64的栈溢出的区别

x86是栈传参,x64是寄存器传参按顺序RDI、RSI、RDX、RCX、R8 、R9(寄存器不够会拿栈传参)如下面代码块,在计算栈溢出的时候需要额外加8
x64

X86


没有system函数需要去libc.so程序里寻找

systemaddr 打印system函数地址

vulnerable_function()漏洞函数

128+8才可以覆盖到rbp栈底,因为x64得把寄存器算进去

运行程序

0x7fc10a2b23a0 就是systemaddr打印的system的内存地址。

systemaddr函数是会打印system地址可以使用这个地址减去libc.symbols['system']得到libc的地址
由于程序里没有system函数所以可以通过libc.so里找到system函数和/bin/sh得到后不能直接使用。

获得POP_rdi_ret0x0000000000021112

获取libc.so

解析文件

获得systemaddr 输出并获取偏移量

计算内存偏移量获取PopRdiret内存地址

构造payload

mov     edx, 1101b      ; n
mov     esi, 4008C1h    ; "Hello, World\n"
mov     edi, 1          ; fd
call    _write
mov     edx, 1101b      ; n
mov     esi, 4008C1h    ; "Hello, World\n"
mov     edi, 1          ; fd
call    _write
mov     dword ptr [esp+8], 0Dh ; n
mov     dword ptr [esp+4], offset aHelloWorld ; "Hello, World\n"
mov     dword ptr [esp], 1 ; fd
call    _write
mov     dword ptr [esp+8], 0Dh ; n
mov     dword ptr [esp+4], offset aHelloWorld ; "Hello, World\n"
mov     dword ptr [esp], 1 ; fd
call    _write
[*] '/home/giantbranch/pwn/ROP_STEP_BY_STEP/linux_x64/level4'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)
[*] '/home/giantbranch/pwn/ROP_STEP_BY_STEP/linux_x64/level4'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)
int __cdecl main(int argc, const char **argv, const char **envp)
{
  systemaddr(argc, argv, envp); //打印出System的地址
  write(1, "Hello, World\n", 0xDuLL);
  return vulnerable_function(); //漏洞函数
}
int __cdecl main(int argc, const char **argv, const char **envp)
{
  systemaddr(argc, argv, envp); //打印出System的地址
  write(1, "Hello, World\n", 0xDuLL);
  return vulnerable_function(); //漏洞函数
}
int systemaddr()
{
  void *v0; // rax
  void *v2; // [rsp-8h] [rbp-8h]
 
  v2 = dlopen("libc.so.6", 1);
  v0 = dlsym(v2, "system"); //system获得地址
  printf("%p\n", v0);
  return fflush(stdout);
}
int systemaddr()
{
  void *v0; // rax
  void *v2; // [rsp-8h] [rbp-8h]
 
  v2 = dlopen("libc.so.6", 1);
  v0 = dlsym(v2, "system"); //system获得地址
  printf("%p\n", v0);
  return fflush(stdout);
}
ssize_t vulnerable_function()
{
  __int64 v1; // [rsp-80h] [rbp-80h] BYREF
 
  return read(0, &v1, 0x200uLL);
}
ssize_t vulnerable_function()
{
  __int64 v1; // [rsp-80h] [rbp-80h] BYREF
 
  return read(0, &v1, 0x200uLL);
}
giantbranch@ubuntu:~/pwn/ROP_STEP_BY_STEP/linux_x64$ ./level4
0x7fc10a2b23a0
Hello, World
giantbranch@ubuntu:~/pwn/ROP_STEP_BY_STEP/linux_x64$ ./level4
0x7fc10a2b23a0
Hello, World
giantbranch@ubuntu:~/pwn/ROP_STEP_BY_STEP/linux_x64$ ROPgadget --binary libc.so  --only "pop|ret" | grep rdi 
0x000000000002026b : pop rdi ; pop rbp ; ret
0x0000000000021112 : pop rdi ; ret
0x00000000000674a9 : pop rdi ; ret 0xffff
giantbranch@ubuntu:~/pwn/ROP_STEP_BY_STEP/linux_x64$ ROPgadget --binary libc.so  --only "pop|ret" | grep rdi 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

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