ISG2015
一天的成果。
Re300 是男人就下一百层
一个64位的程序,放到IDA里的话,IDA就会分析不动,这样就把人给下着了。objdump –d re300 > output,这样拿到汇编代码,大概在120M左右,代码量很大。
拿到vim里分析,发现代码很简单,读入数据后,一直在判断判断输入数据的正确性,如果读入的数据不正确,就结束。如果一直正确的话,在程序的结尾,

jmp *%rsp 也就跳到了我们输入数据的地方,也就是说我们输入的数据被当作指令又被执行了,在调试时,我直接设置rip到栈顶,发现如果输入正确的话,输入的内容确实可以当作代码执行,代码的风格和第一次objdump出来的代码非常类似。然后,突然我明白了题目的奥秘,输入的数据被当作代码执行,被执行的代码又要求输入数据,数据又被当作代码执行,一直循环下去,就像个洋葱一样一层一层的。
我拿到了objdump出来的汇编代码,写了一个脚本然后处理下就得到了应输入的数据。

第一轮过后,生成的数据3M多,当我尝试调试的时候,发现read系统调用一次读不了那么多数据。所以我干脆不调了,直接又写了下一个脚本来分析。

这样当第8轮还是第9轮时,输出只剩不倒1K了,我这时候直接将数据发送到栈顶,并调整rip到那个栈顶,这样,稍微调试了下,我就知道看到flag了。最后我又用python生成了下flag。

Lol
这道题目主要是android native 层的调试。Java的代码很简单。

Java_com_example_crackme2_MainActivity_getflag函数很复杂,但是经过阅读,发现这些代码就是在扰乱分析者。

输入的字符串,在到达en函数前,看似很复杂的处理,其实是在扰乱分析。调试时,发现en的参数inputs就是用户输入的参数,第二个参数addr就是用来传判断结果的(通过分析en函数知道的)。
所以重点就放到了en函数里。en函数也是很复杂,但是,我注意到了几点东西。




我看到了两个对输入处理的地方,就是前两个图。看到了对输入处理后判断的两处地方。因此,明白了大概的意思,也就是输入的每一位都经过两个处理方法的某一种(但是我不知道哪一种)进行了处理。我索性写了个脚本,把这两个运算的都跑了下。脚本如下:

跑出的效果呢?

仔细一看,就知道了,隔一个字符使用其中一个处理方法,所以将两个输出交叉读取,就拿到flag了。
Forest
只有java代码,代码量也不大,稍微读了下,就知道意思了。程序将输入使用三个简单的加密运算加密后,拼接在一起,然后做判断。

密文的长度为18,起初我以为输入的长度为6,这样三个加密算法的加密后拼接刚好18个字符。但是我发现加密算法3应该是base64,但是base64里不会出现’{‘字符。晕了半天,最后看到最终bh函数check的时候,只取了至多前18个字符,突然想到,输入的长度必须大于6。第二个算法是一个置换算法,也不会产生’{‘字符,因此确定了输入的长度就是18,也就是说密文是由第一个算法产生的。后两个算法都是干扰分析的。
随后分析了下第一个算法,发现第一个算法和rot13是相似的。即E(E(a))=a。所以直接抠出代码,编译执行,得到flag。

Echo
这个是赛后看的,题目思路很清晰,一看就是个格式化字符串洞。但是有一点就是程序是pie的,每次加载的地址不固定。调试时为了方便调试我首先把alsr给关了。通过该漏洞可以泄漏出__libc_start_main函数的地址,也就直接泄漏了libc.so里想要的/bin/sh字符串和system的地址。

这样的话,我就可以任意地址写将返回地址改为system的地址,把参数改为/bin/sh的地址,函数一退出就拿到shell了。

Poc

ISG2015的更多相关文章
- Bctf-pwn_ruin-re_lastflower
Pwn-ruin 用几个词来概括下漏洞原理:Arm+heap overflow(house of force)+dl-resolve Info leak: 在printf key8时,泄漏堆上地址(s ...
随机推荐
- 第五章 Logistic回归
第五章 Logistic回归 假设现在有一些数据点,我们利用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称作回归. 为了实现Logistic回归分类器,我们可以在每个特征上都乘以一 ...
- [AC自动机][HDU3065]
//====================== // HDU 2222 // 求目标串中出现了几个模式串 //输入 //1 //5 //she //he //say //shr //her //ya ...
- Vlc基础数据结构记录
1. Vlc基础数据结构 hongxianzhao@hotmail.com 1.1 基础数据结构 struct vlc_object_t,相关文件为src\misc\objects.c. 定义为: ...
- NET基础课--应用程序编译和执行1
- ASP.NET Signalr 2.0 实现一个简单的聊天室
学习了一下SignalR 2.0,http://www.asp.net/signalr 文章写的很详细,如果头疼英文,还可以机翻成中文,虽然不是很准确,大概还是容易看明白. 理论要结合实践,自己动手做 ...
- jQuery中$.getJSON的返回值问题
在使用$.getJSON获得数据库的返回值后,想将该值return传给其他函数.结果遇到问题. $.getJSON(url, data, function(result) { return resul ...
- UVA 10806 Dijkstra, Dijkstra.
题意: 从起点走到终点,然后从终点走到起点,其中不能同时走过相同的一条边,问你最小路径长度.先输入终点n,起点为1,接下来输入m,代表有m条边.每条边由起点,终点,长度组成. 分析: 求最小长度,还限 ...
- Intersection of Two Linked Lists(java)
eg: a1 → a2 ↘ c1 → c2 → c3 或者直接a1 → b1 ↗ b1 → b2 → b3求公共链表c1. 常规的指针分裂法,复制法,偏移法. public class Solutio ...
- 重写TextView,实现圆形背景,文本居中显示
最近,在做考试试题排版,产品提出题号希望显示成圆形背景,序号文本居中显示. (有点问题:文本没有绝对居中,暂时没做处理.) 为此,我采取的方式是重写TextView的onDraw方法,绘制一个圆形背景 ...
- C#中equals方法和==的区别
Msdn中对equals方法的解释是:确定指定的对象是否等于当前对象. Equals方法是比较对象的内容,而==则是比较整个对象是否相等. Equals方法判断的是堆中的值,而==则判断的是堆栈中的值 ...