MIsc:流量分析

  这道题,在比赛的时候就差个key了,但是没想到要改高度,后来群里师傅说了下,就再试试,

导出来改高度。

导出来,把

把%5c(4)前面的hex删掉,改成png,就直接拿去那个img-add_info里面出现的,就ok了

转acsii就出来了

web:滴~~~~~~

  

这道题是我朋友教我的。看到这里就有个文件读取,

然后,看了下源代码,发现都是flag.jpg是用base64读出来的。

那有没可能读取其他的文件,然后用这种方法将文件直接读出来,再用base64解码呢。现在除了index.php (和flag.txt  脑海里幻想  希望就有这文件而且直接能读吧,打脸了),直接读index.php,发现和之前的一道百度杯很像,但是这里将config 换成了!,

就找到了indexphp的源码了,但是这个和百度杯的那个似乎不一样,怎么试都找不到那个.base文件。就问了下我朋友,他说上面的博客会有提示,whta_the—fuc!!!一开始我还以为是出题人为了宣传自己的博客而放在那里了呢。结果我想多了。

就是这篇文章,说的vim异常退出时产生的文件

这里借一下这位师傅的图

然后就每个都试试,还真的能行。

?>
<?php
include('config.php');
$k = 'hello';
extract($_GET);
if(isset($uid))
{
$content=trim(file_get_contents($k));
if($uid==$content)
{
echo $flag;
}
else
{
echo'hello';
}
} ?>

就读出了这个,这个我记得bugku

也这样的题,就是变量覆盖

https://www.jianshu.com/p/a4d782e91852   这篇文章讲得不错。

2、re

这两道re都是挺基础的,有耐心一点点分析就肯定能出来,一开始以为自己没做个re的题,新手,不敢尝试想留着赛后慢慢复现的,结果就留到了最后一天,结果做到半夜3点。。可怜弱鸡的我

这两道都是差不多题的目,只是壳不同了,之前没脱过壳,后来找了下esp定律,真香。

第一道题 把壳脱完,就出flag,直接跟下去

我没xp,和win7  脱壳失败,师傅说win10有内存保护机制,我就直接鲁了

跟下去

关键call。跟进去

输入code,跟进第一个call

我猜想这个会处理前面输入的数据,也就是code

这个eax就是code是数据长度了

call 完了 栈内的数据

这个就很有意思了。这个怎么来的?

前面有个地方

用eax作为一个index在哪个地址取值,


000F2FF8 0000 add byte ptr ds:[eax],al
000F2FFA 0000 add byte ptr ds:[eax],al
000F2FFC 0000 add byte ptr ds:[eax],al
000F2FFE 0000 add byte ptr ds:[eax],al
000F3000 1BA7 133BE458 sbb esp,dword ptr ds:[edi+0x58E43B13]
000F3006 ec in al,dx
000F3007 c4ff les edi,edi
000F3009 ff db ff
000F300A ff db ff
000F300B ff db ff
000F300C ff db ff
000F300D ff db ff
000F300E ff db ff
000F300F ff db ff
000F3010 fe db fe
000F3011 ff db ff
000F3012 ff db ff
000F3013 FF01 inc dword ptr ds:[ecx]
000F3015 0000 add byte ptr ds:[eax],al
000F3017 007E 7D add byte ptr ds:[esi+0x7D],bh
000F301A 7C 7B jl short reverse1.000F3097
000F301C 7A 79 jpe short reverse1.000F3097
000F301E 78 77 js short reverse1.000F3097
000F3020 76 75 jbe short reverse1.000F3097
000F3022 74 73 je short reverse1.000F3097
000F3024 72 71 jb short reverse1.000F3097
000F3026 70 6F jo short reverse1.000F3097
000F3028 6e outs dx,byte ptr ds:[esi]
000F3029 6d ins dword ptr es:[edi],dx
000F302A 6c ins byte ptr es:[edi],dx
000F302B 6B6A 69 68 imul ebp,dword ptr ds:[edx+0x69],0x68
000F302F 67 addrsize:
000F3030 66 datasize:
000F3031 65 gs:
000F3032 64:6362 61 arpl word ptr fs:[edx+0x61],sp
000F3036 60 pushad
000F3037 5F pop edi ; reverse1.000F33D4
000F3038 5E pop esi
000F3039 5D pop ebp
000F303A 5C pop esp
000F303B 5B pop ebx
000F303C 5A pop edx
000F303D 59 pop ecx
000F303E 58 pop eax
000F303F 57 push edi ; reverse1.000F33D4
000F3040 56 push esi
000F3041 55 push ebp
000F3042 54 push esp
000F3043 53 push ebx
000F3044 52 push edx
000F3045 51 push ecx
000F3046 50 push eax
000F3047 4F dec edi ; reverse1.000F33D4
000F3048 4E dec esi
000F3049 4D dec ebp
000F304A 4c dec esp
000F304B 4B dec ebx
000F304C 4A dec edx
000F304D 49 dec ecx
000F304E 48 dec eax
000F304F 47 inc edi ; reverse1.000F33D4
000F3050 46 inc esi
000F3051 45 inc ebp
000F3052 44 inc esp
000F3053 43 inc ebx
000F3054 42 inc edx
000F3055 41 inc ecx
000F3056 40 inc eax
000F3057 3F aas
000F3058 3e:3d 3c3b3a39 cmp eax,0x393a3b3c
000F305E 3837 cmp byte ptr ds:[edi],dh
000F3060 36:35 34333231 xor eax,0x31323334
000F3066 302F xor byte ptr ds:[edi],ch
000F3068 2e:2d 2c2b2a29 sub eax,0x292a2b2c
000F306E 2827 sub byte ptr ds:[edi],ah
000F3070 26:25 24232221 and eax,0x21222324
000F3076 2000 and byte ptr ds:[eax],al
000F3078 0100 add dword ptr ds:[eax],eax
000F307A 0000 add byte ptr ds:[eax],al
000F307C A8 1B test al,0x1B
000F307E 42 inc edx
000F307F 0070 10 add byte ptr ds:[eax+0x10],dh
000F3082 42 inc edx


 

就可以看到这些了,而eax呢

通过我们们输入的字符的16进制作为,从0xf2ff8开始找,最后和DDCTF{reverseME}对比一下就ok了,这个就是这道题的解法。

第二道是ASP的壳,一样用esp定律,这里也有像第一道re一样的处理方法,

一样关键call,但是这个call首先判断输入是否合法

012511F0    8BC6            mov eax,esi  #esi 指向 字符串
012511F2 8D50 lea edx,dword ptr ds:[eax+0x1]
012511F5 8A08 mov cl,byte ptr ds:[eax]
012511F7 inc eax
012511F8 84C9 test cl,cl
012511FA ^ F9 jnz short reverse2.012511F5
012511FC 2BC2 sub eax,edx//eax为字符数
012511FE 8BD0 mov edx,eax//edx也为字符数
je short reverse2.0125123B
and eax,0x80000001// eax 为1 就是说eax的最后一位不能为1即 flag的数目为0x10
jns short reverse2.0125120E
dec eax
0125120A 83C8 FE or eax,-0x2
0125120D inc eax 0125120E 83F8 cmp eax,0x1
je short reverse2.0125123B//就是说eax的最后一位不能为1即 flag的数目为0x10
33C9 xor ecx,ecx
85D2 test edx,edx
7E 1F jle short reverse2.
8DA424 lea esp,dword ptr ss:[esp]
8A0431 mov al,byte ptr ds:[ecx+esi]
3C cmp al,0x30//
7C jl short reverse2.0125122B
3C cmp al,0x39//
7E jle short reverse2.
0125122B 3C cmp al,0x41
0125122D 7C 0C jl short reverse2.0125123B//全部大于0x41
0125122F 3C cmp al,0x46
7F jg short reverse2.0125123B//且小于0x46 'F'
inc ecx
3BCA cmp ecx,edx
^ 7C E8 jl short reverse2.
B0 mov al,0x1
0125123A C3 retn
0125123B 32C0 xor al,al
0125123D C3 retn //0-9 A-F

然后往下走

然后这个就是关键的判断函数了。

0125125F    8D50          lea edx,dword ptr ds:[eax+0x1]
8A08 mov cl,byte ptr ds:[eax]
inc eax
84C9 test cl,cl
^ F9 jnz short reverse2.
2BC2 sub eax,edx// eax 就是字符数
0125126B FF030000 push 0x3FF
8BF8 mov edi,eax
8D4424 lea eax,dword ptr ss:[esp+0x11]
6A push 0x0
push eax
884C24 mov byte ptr ss:[esp+0x18],cl
0125127D E8 E8090000 call reverse2.01251C6A ; jmp 到 msvcr90.memset
83C4 0C add esp,0xC
33D2 xor edx,edx
85FF test edi,edi ; msvcr90.printf
7E jle short reverse2.012512EC
0125128B push ebx 0125128C 8A5C24 0F mov bl,byte ptr ss:[esp+0xF]
8A0416 mov al,byte ptr ds:[esi+edx]
8AC8 mov cl,al
80E9 sub cl,0x30
80F9 cmp cl,0x9 //跟0x39比(0-9)
0125129B ja short reverse2.012512A3 如果小与9 就直接把给esp+0xf//大于了就给下面字符的处理
0125129D 884C24 0F mov byte ptr ss:[esp+0xF],cl
012512A1 EB jmp short reverse2.012512B3
012512A3 8AC8 mov cl,al
012512A5 80E9 sub cl,0x41
012512A8 80F9 cmp cl,0x5 //(A-F)
012512AB ja short reverse2.012512B3
012512AD 2C sub al,0x37 //不大的话就直接减0x37,然后给esp+0xf
012512AF 0F mov byte ptr ss:[esp+0xF],al 012512B3 8A4416 mov al,byte ptr ds:[esi+edx+0x1] //下一位是否为数字
012512B7 8AC8 mov cl,al
012512B9 80E9 sub cl,0x30
012512BC 80F9 cmp cl,0x9
012512BF ja short reverse2.012512C5//如果是数字就将cl给bl,不然就交给下面,下面判断字符
012512C1 8AD9 mov bl,cl
012512C3 EB 0E jmp short reverse2.012512D3
012512C5 8AC8 mov cl,al //是否是字符
012512C7 80E9 sub cl,0x41
012512CA 80F9 cmp cl,0x5
012512CD ja short reverse2.012512D3
012512CF 2C sub al,0x37 //如果是字符就将al减去0x37,然后再给bl
012512D1 8AD8 mov bl,al
上的结论。是数字就直接给bl,字符的渐趋0x37再给bl 012512D3 8A4424 0F mov al,byte ptr ss:[esp+0xF]//将esp+0xf的值给al,这里是第一次处理的数据
012512D7 C0E0 shl al,0x4 //然后al左移四位 012512DA 8BCA mov ecx,edx
012512DC 0AC3 or al,bl //al or bl ,然后赋予给al
012512DE D1E9 shr ecx, //ecx右移1位,就相当于除于二
012512E0 83C2 add edx,0x2 //edx就相当于index
012512E3 3BD7 cmp edx,edi edi是字符数 ; msvcr90.printf
012512E5 88440C mov byte ptr ss:[esp+ecx+0x10],al
012512E9 ^ 7C A5 jl short reverse2.
012512EB 5B pop ebx ; msvcr90.printf
012512EC 8BC7 mov eax,edi ; msvcr90.printf
012512EE cdq// 将eax的32bit 复制到edx的每一个bit上去
012512EF 2BC2 sub eax,edx
012512F1 D1F8 sar eax,// eax 除以二
012512F3 push ebp
012512F4 push eax
012512F5 8D4C24 lea ecx,dword ptr ss:[esp+0x14] ecx指向那个前面弄的数组里面就是esp+ecx+0x10
012512F9 E8 02FDFFFF call reverse2.
012512FE 8B8C24 mov ecx,dword ptr ss:[esp+0x414]
83C4 add esp,0x8
5F pop edi ; msvcr90.printf
5D pop ebp ; msvcr90.printf
0125130A 33CC xor ecx,esp
0125130C E8 4D010000 call reverse2.0125145E
81C4 add esp,0x408
C3 retn

下面这个是最关键的了。

    8A4424        mov al,byte ptr ss:[esp+0x14]# 第一次调用
8AD0 mov dl,al
C0EA shr dl,0x2
0125107B and al,0x3
0125107D C0E0 shl al,0x4
mov byte ptr ss:[esp+0x18],dl# 第一次赋值
bl是第二次就是中间的值
8ACB mov cl,bl
C0E9 shr cl,0x4
02C1 add al,cl
0125108B mov byte ptr ss:[esp+0x19],al #第二次赋值 0125108F 8A4424 mov al,byte ptr ss:[esp+0x16]# 第san次调用
8AD3 mov dl,bl
80E2 0F and dl,0xF
02D2 add dl,dl
0125109A 8AC8 mov cl,al
0125109C 02D2 add dl,dl
0125109E C0E9 shr cl,0x6
012510A1 02D1 add dl,cl
012510A3 3F and al,0x3F
012510A5 1A mov byte ptr ss:[esp+0x1A],dl#第三次赋值
012510A9 1B mov byte ptr ss:[esp+0x1B],al#第四次赋值
012510AD 33F6 xor esi,esi
012510AF nop
012510B0 0FB65434 movzx edx,byte ptr ss:[esp+esi+0x18]
012510B5 8A82 mov al,byte ptr ds:[edx+0x1253020]
012510BB xor al,0x76
012510BD 0FB6C8 movzx ecx,al
012510C0 push ecx
012510C1 8D4C24 lea ecx,dword ptr ss:[esp+0x24] //
012510F7 8A5C24 mov bl,byte ptr ss:[esp+0x21] bl也是AA
012510FB 83C4 0C add esp,0xC
012510FE 8A4424 mov al,byte ptr ss:[esp+0x14] 这里又恢复到0x38指向的位置
8AC8 mov cl,al
8AD3 mov dl,bl
and al,0x3
C0E0 shl al,0x4
0125110B C0EA shr dl,0x4
0125110E 02C2 add al,dl
C0E9 shr cl,0x2
80E3 0F and bl,0xF
mov byte ptr ss:[esp+0x19],al
0125111A 8A4424 mov al,byte ptr ss:[esp+0x16]
0125111E 02DB add bl,bl
884C24 mov byte ptr ss:[esp+0x18],cl
8AC8 mov cl,al
02DB add bl,bl
C0E9 shr cl,0x6
0125112B 02D9 add bl,cl
0125112D 885C24 1A mov byte ptr ss:[esp+0x1A],bl
3F and al,0x3F
8D5E lea ebx,dword ptr ds:[esi+0x1]
33FF xor edi,edi
1B mov byte ptr ss:[esp+0x1B],al
0125113C 85DB test ebx,ebx
0125113E 7E jle short reverse2.
0FB6543C movzx edx,byte ptr ss:[esp+edi+0x18]
8A82 mov al,byte ptr ds:[edx+0x1253020]
0125114B xor al,0x76
0125114D 0FB6C8 movzx ecx,al
push ecx
8D4C24 lea ecx,dword ptr ss:[esp+0x24]

就是这个搞了我好几个小时,

关键的就是

这就个add ,这里通过前面的几个运算,然后四个bit一起,往栈写8个bit 这8个bit是用前面算好的 放在[esp + 0x14] 到[esp +0x 16] 的这个值,然后通运算在

                add dword ptr ds:[eax],eax
add byte ptr ds:[eax],al
adc al,0x21
0125301A and eax,0x1
0125301F add byte ptr ds:[edi],dh
xor al,0x35
xor dh,byte ptr ds:[ebx]
xor byte ptr ds:[ecx],dh
3e:3f aas
3C 3D cmp al,0x3D
0125302B 3A3B cmp bh,byte ptr ds:[ebx]
0125302D cmp byte ptr ds:[ecx],bh
0125302F : daa
and al,0x25
and ah,byte ptr ds:[ebx]
and byte ptr ds:[ecx],ah
2e:2f das
2C sub al,0x17
0125303B adc al,0x15
0125303D adc dl,byte ptr ds:[ebx]
0125303F adc byte ptr ds:[ecx],dl
1E push ds
1f pop ds
1C 1D sbb al,0x1D
1A1B sbb bl,byte ptr ds:[ebx]
sbb byte ptr ds:[ecx],bl
push es
0125304A pop es
0125304B add al,0x5
0125304D add al,byte ptr ds:[ebx]
0125304F add byte ptr ds:[ecx],al
0E push cs
0f db 0f
0C or al,0x46
inc edi
inc esp
inc ebp //
inc edx
inc ebx
0125305A inc eax
0125305B inc ecx
0125305C 4E dec esi
0125305D 4F dec edi
0125305E 5D pop ebp
0125305F pop ecx
add dword ptr ds:[eax],eax
add byte ptr ds:[eax],al
A8 1B test al,0x1B
B6 mov dh,0x0
jo short reverse2.0125307A
0125306A B6 mov dh,0x0

这个表里面找出数据最后和0x76 XOR  最后结果是 DDCTF{reverse+}括号里面的内容就ok,前面也有个地方判断,字符串的长度的最后一位不能是1,还有要满足6的倍数,不然最后一个会加上'='  这就不可能匹配了。

经过了这次的比赛后,发现re还是得多练,一步不跟进,慢慢分析里面的算法,小心出题的人留下的坑。。。。。

有哪里写的不对的请大家多多包涵,可以的希望能给我指出来。

DDCTF2019 的四道题wp的更多相关文章

  1. lintcode中等题目的四道题

    第一题: 第一句先创建了一个解决问题的类, 第二句声明了一个公共接口的整形链表里面有N个整形数, 第三句给链表动态初始化, 第四步判断链表里的数有没有,如果N<=0则返回结果0,否则执行Prin ...

  2. 2019看雪CTF 晋级赛Q2第四题wp

    上次参加2019看雪CTF 晋级赛Q2卡在了这道题上,虽然逆出算法,但是方程不会解,哈哈哈哈,果然数学知识很重要呀,现在记录一下. 首先根据关键信息,根据错误提示字符串定位到这里: 1 int __t ...

  3. 关于gcd的四道题

    T1:bzoj2705 题目描述: 给定一个n求\(\sum\limits_{i=1}^ngcd(i,n)\) 因为n太大,所以O(n)的做法肯定不行,然后就去想根号的方法. \[\sum\limit ...

  4. lintcode 四道题

    我们考虑对每个字符进行两边扩展,寻找回文串,并记录长度.有两种情况,一种是bab,从a向两边扩展,一种abba,从bb中间向两边扩展. dp[i][j] 表示子串s[i-j]是否是回文 初始化:dp[ ...

  5. google Kickstart Round F 2017 四道题题解

    Problem A. Kicksort 题意抽象一下为: 对于一个每次都从数列正中间取划分数的快速排序,给定一个1-n的排列,问快排的复杂度对于这个排列是否会退化为最坏复杂度. 数据范围: 测试组数1 ...

  6. Android智能指针sp wp详解

    研究Android的时候,经常会遇到sp.wp的东西,网上一搜,原来是android封装了c++中对象回收机制.说明:1. 如果一个类想使用智能指针,那么必须满足下面两个条件:    a. 该类是虚基 ...

  7. NOIP2012普及组 (四年后的)解题报告 -SilverN

    本章施工仍未完成 现在的时间是3.17 0:28,我困得要死 本来今天(昨天?)晚上的计划是把整个四道题的题解写出来,但是到现在还没写完T4的高效算法,简直悲伤. 尝试了用floyd写T4,终于大功告 ...

  8. ACM第四次积分赛

    虽然因为第一题给的数据有问题,没能四道题都做出来,但是这次第四名,进步很大,继续努力! SAU-ACM总比赛成绩       姓名     账号  上学期成绩 第一次成绩 第二次成绩 第三次成绩 第四 ...

  9. CTF---Web入门第四题 Forms

    Forms分值:10 来源: Ph0enix 难度:易 参与人数:4945人 Get Flag:2776人 答题人数:2824人 解题通过率:98% 似乎有人觉得PIN码是不可破解的,让我们证明他是错 ...

随机推荐

  1. Java基于回调的观察者模式详解

    本文由“言念小文”原创,转载请说明文章出处 一.前言 什么是回调?回调如何使用?如何优雅的使用?本文将首先详解回调的原理,然后介绍回调的基本使用方法,最后介绍基于回调的“观察者模式”实现,演示如何优化 ...

  2. Apache 4.x HttpClient

    public static Map callRequest(String requestUrl, Method method, Map<String, String> data) thro ...

  3. DOS批量重命名

    下面有一些文件:dir /b *.*得到 144-10.1.4.150-1484707792127 2326-10.1.4.150-1484708376194 3682-10.1.4.150-1484 ...

  4. Leetcode Tags(8)Binary Search

    一.475. Heaters 输入: [1,2,3],[2] 输出: 1 解释: 仅在位置2上有一个供暖器.如果我们将加热半径设为1,那么所有房屋就都能得到供暖. 输入: [1,2,3,4],[1,4 ...

  5. Educational Codeforces Round 71 (Rated for Div. 2)E. XOR Guessing

    一道容斥题 如果直接做就是找到所有出现过递减的不同排列,当时硬钢到自闭,然后在凯妹毁人不倦的教导下想到可以容斥做,就是:所有的排列设为a,只考虑第一个非递减设为b,第二个非递减设为c+两个都非递减的情 ...

  6. Oracle 相关操作SQL

    SELECT l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#,l.os_user_name,s.machi ...

  7. SpringBoot之集成MyBatis

    引入工程依赖包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  8. Linux基于webRTC的二次开发(一)

    最近在做Linux平台下webRTC的二次开发,一路摸索,中间踩了不少坑,这一篇博客先来简单介绍下Linux上如何使用GCC编译webRTC. 为什么使用GCC编译? 这其实是无奈之举,Linux下w ...

  9. __new__与__init__的区别和应用场景

    创建实例的时候, 先运行的_new_方法, _new_创建对象 Student object(实例)返回给 _init_ 里面的第一个参数self class Student(object): def ...

  10. IntelliJ IDEA自动部署项目至远程服务器与传统部署项目至远程服务器的区别

    每次开发Java项目时,对于所有Java开发人员来说,最枯燥的不是修改代码,而是实时将自己的代码上传至远程服务器,进行测试或者部署,本人最初开发也是这样,通过使用Xshell 5,WinSCP等工具对 ...