首页
社区
课程
招聘
[原创]叹息之墙 writeup
2018-10-1 23:12 5164

[原创]叹息之墙 writeup

2018-10-1 23:12
5164

拿到程序之后拖进ida,发现是一个控制流平坦化的混淆,而且其中夹杂了大量的辣鸡代码。

 

于是考虑跑一个trace,来分析程序的流程。

 

首先利用deflat.py,可以获得控制流平坦化中每一个基本块对应的地址。

 

 

获得地址之后,使用odscript来记录程序的执行流程,这里我程序的base是0x12B0000

bp 12bbdc1
bp 12bbff3
bp 12bd599
bp 12bd5a8
(省略一堆下断点的指令)
bp 130c0fa
wrt "out2.txt", "log"
next:
    wrta "out2.txt",eip
    wrta "out2.txt","\r\n"
    run
    jmp next

拿到trace之后可以开始分析一些比较可疑的地方,首先是这里:

 

 

在trace记录中搜索,这个基本块也是只执行了一次,所以这里应该是获取用户输入的地方。

 

可以对这里下断点进行验证:

 

 

之后继续对trace进行分析,发现从12BD5A8

 

 

开始是一个循环,一共执行了6遍,于是猜测这里是对输入的字符串进行了一定的处理

 

而这个循环中包含了另一个可疑的区块:

 

 

这里使用了%d%n对输入的字符串进行了处理,于是猜测之后可能是直接使用%d录入的输入数字,于是对%d对应的内存区域下内存访问断点。后面会在这里断下来:

 

 

同样在trace里面查看,这里同样也执行了6次,这个基本块大致功能就是用snprintf(猜测)打印输入的字符串到另一个区域,相当于复制了一份输入,但是对那一片内存区域下访问断点之后没有断下来,所以猜测这里是一个没有任何作用的拷贝操作。

 

同样断下来的还有几个地方,但是经过分析之后都是一些没有任何作用的操作。

 

最后终于发现了一个有意义的操作:

 

 

在这里0x93fe40是输入的数字转成int之后储存的地址,这里把这个数作为索引到0x93f000取了一个数,并且以64位的大小累加到了[esi+0x3024]这个内存区域,于是对这个地方下一个内存访问断点。

 

最后可以在这里断下来:

 

 

在trace中查看发现这个基本块只执行了一次,并且在格式错误的情况下不会执行到,所以这里极有可能是验证的位置。这里调用了一个函数,并且把返回值与0x93f580这个地址进行了比较,于是这里尝试手动让这个条件成立:

 

 

可以发现程序成功输出了答案正确的提示,所以是验证函数没跑了。

 

于是我们需要分析的就是8A1020这个函数,直接看没法看出这个函数直接的作用。

 

 

分析引用后可以发现这个函数调用了aullrem这个函数,经过查询,这是一个64位取模的函数。所以对这个函数下断点,分析其调用方式。

 

发现8A1020调用了这个取模函数很多次,并且行为非常像快速幂算法。于是手动提取出模数进行验证,可以发现这个函数的功能就是pow(x,y,4288794511)。

 

到此为止,整个程序的算法就基本还原完成了,大致流程就是取输入的每一个数进行索引,并将索引到的元素求和,最后带入方程1702197298 ^ x mod 4288794511 = 1851878196进行验证。

 

反解的第一步就是求出1702197298 ^ x mod 4288794511 = 1851878196的解。

 

直接用sage解出方程

a = Mod(1851878196, 4288794511)
b = Mod(1702197298, 4288794511)
print discrete_log(a, b)

得到通解: x = 4288794510k + 1427250197

 

最后需要从351个数中选出不超过9个数让他们的和等于通解

 

所以这里直接用比较经典的背包问题思路去做:

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;

const LL mod = 4288794510LL;


LL a[352] = {0, 15825810LL, 31651620LL, 47477430LL, 63303240LL, 79129050LL, 94954860LL, 110780670LL, 126606480LL, 138348210LL, 142432290LL, 158258100LL, 174083910LL, 189909720LL, 205735530LL, 221561340LL, 237387150LL, 252282030LL, 253212960LL, 269038770LL, 276696420LL, 284864580LL, 300690390LL, 316516200LL, 329907270LL, 332342010LL, 348167820LL, 363993630LL, 379819440LL, 389890410LL, 395645250LL, 411471060LL, 415044630LL, 427296870LL, 443122680LL, 458948490LL, 474774300LL, 490600110LL, 504564060LL, 506425920LL, 522251730LL, 538077540LL, 553392840LL, 553903350LL, 569729160LL, 585554970LL, 601380780LL, 612684930LL, 617206590LL, 633032400LL, 648858210LL, 659814540LL, 664684020LL, 680509830LL, 691741050LL, 696335640LL, 712161450LL, 727987260LL, 743813070LL, 756846090LL, 759638880LL, 775464690LL, 779780820LL, 791290500LL, 807116310LL, 822942120LL, 830089260LL, 838767930LL, 854593740LL, 857758902LL, 870419550LL, 886245360LL, 902071170LL, 917896980LL, 933722790LL, 949548600LL, 965374410LL, 968437470LL, 981200220LL, 989721810LL, 997026030LL, 1009128120LL, 1012851840LL, 1028677650LL, 1044503460LL, 1060329270LL, 1076155080LL, 1091980890LL, 1106785680LL, 1107806700LL, 1123632510LL, 1139458320LL, 1155284130LL, 1169671230LL, 1171109940LL, 1186935750LL, 1202761560LL, 1218587370LL, 1225369860LL, 1234413180LL, 1245133890LL, 1250238990LL, 1261410150LL, 1266064800LL, 1281890610LL, 1297716420LL, 1313542230LL, 1319629080LL, 1329368040LL, 1345193850LL, 1361019660LL, 1376845470LL, 1383482100LL, 1392671280LL, 1408497090LL, 1424322900LL, 1429598170LL, 1440148710LL, 1455974520LL, 1471800330LL, 1487626140LL, 1503451950LL, 1513692180LL, 1519277760LL, 1521830310LL, 1535103570LL, 1550929380LL, 1559561640LL, 1566755190LL, 1582581000LL, 1598406810LL, 1614232620LL, 1630058430LL, 1645884240LL, 1649536350LL, 1660178520LL, 1661710050LL, 1677535860LL, 1693361670LL, 1709187480LL, 1715517804LL, 1725013290LL, 1740839100LL, 1756664910LL, 1765974210LL, 1772490720LL, 1788316530LL, 1798526730LL, 1804142340LL, 1819968150LL, 1835793960LL, 1838054790LL, 1851619770LL, 1867445580LL, 1883271390LL, 1899097200LL, 1914923010LL, 1930748820LL, 1936874940LL, 1946574630LL, 1949452050LL, 1962400440LL, 1978226250LL, 1979443620LL, 1994052060LL, 2009877870LL, 2018256240LL, 2025703680LL, 2041529490LL, 2057355300LL, 2073181110LL, 2075223150LL, 2089006920LL, 2104832730LL, 2120658540LL, 2136484350LL, 2144397255LL, 2152310160LL, 2168135970LL, 2183961780LL, 2199787590LL, 2213571360LL, 2215613400LL, 2231439210LL, 2247265020LL, 2263090830LL, 2270538270LL, 2278916640LL, 2294742450LL, 2309350890LL, 2310568260LL, 2326394070LL, 2339342460LL, 2342219880LL, 2351919570LL, 2358045690LL, 2373871500LL, 2389697310LL, 2405523120LL, 2421348930LL, 2437174740LL, 2450739720LL, 2453000550LL, 2468826360LL, 2484652170LL, 2490267780LL, 2500477980LL, 2516303790LL, 2522820300LL, 2532129600LL, 2547955410LL, 2563781220LL, 2573276706LL, 2579607030LL, 2595432840LL, 2611258650LL, 2627084460LL, 2628615990LL, 2639258160LL, 2642910270LL, 2658736080LL, 2674561890LL, 2690387700LL, 2706213510LL, 2722039320LL, 2729232870LL, 2737865130LL, 2753690940LL, 2766964200LL, 2769516750LL, 2775102330LL, 2785342560LL, 2801168370LL, 2816994180LL, 2832819990LL, 2848645800LL, 2859196340LL, 2864471610LL, 2880297420LL, 2896123230LL, 2905312410LL, 2911949040LL, 2927774850LL, 2943600660LL, 2959426470LL, 2969165430LL, 2975252280LL, 2991078090LL, 3006903900LL, 3022729710LL, 3027384360LL, 3038555520LL, 3043660620LL, 3054381330LL, 3063424650LL, 3070207140LL, 3086032950LL, 3101858760LL, 3117684570LL, 3119123280LL, 3133510380LL, 3149336190LL, 3165162000LL, 3180987810LL, 3182008830LL, 3196813620LL, 3212639430LL, 3228465240LL, 3244291050LL, 3260116860LL, 3275942670LL, 3279666390LL, 3291768480LL, 3299072700LL, 3307594290LL, 3320357040LL, 3323420100LL, 3339245910LL, 3355071720LL, 3370897530LL, 3386723340LL, 3402549150LL, 3418374960LL, 3431035608LL, 3434200770LL, 3450026580LL, 3458705250LL, 3465852390LL, 3481678200LL, 3497504010LL, 3509013690LL, 3513329820LL, 3529155630LL, 3531948420LL, 3544981440LL, 3560807250LL, 3576633060LL, 3592458870LL, 3597053460LL, 3608284680LL, 3624110490LL, 3628979970LL, 3639936300LL, 3655762110LL, 3671587920LL, 3676109580LL, 3687413730LL, 3703239540LL, 3719065350LL, 3734891160LL, 3735401670LL, 3750716970LL, 3766542780LL, 3782368590LL, 3784230450LL, 3798194400LL, 3814020210LL, 3829846020LL, 3845671830LL, 3861497640LL, 3873749880LL, 3877323450LL, 3893149260LL, 3898904100LL, 3908975070LL, 3924800880LL, 3940626690LL, 3956452500LL, 3958887240LL, 3972278310LL, 3988104120LL, 4003929930LL, 4012098090LL, 4019755740LL, 4035581550LL, 4036512480LL, 4051407360LL, 4067233170LL, 4083058980LL, 4098884790LL, 4114710600LL, 4130536410LL, 4146362220LL, 4150446300LL, 4162188030LL, 4178013840LL, 4193839650LL, 4209665460LL, 4225491270LL, 4241317080LL, 4257142890LL, 4272968700LL};
unordered_map<LL, int> mp;
int notpos[11];

pair<LL, int> num[8000010];

int main() {
    int n = 351;
    // x = 4288794510k + 1427250197
    LL goal = 1427250197LL;
    // LL base = 15825810LL;

    for (int i = 1; i <= n; ++i)
        if (a[i] % 10 > 0)
            notpos[a[i] % 10] = i;

    int tot = 0;
    for (int i = 1; i <= n; ++i)
        for (int j = i + 1; j <= n; ++j)
            for (int k = j + 1; k <= n; ++k)
                num[++tot] = {(a[i] + a[j] + a[k]) % mod, i * 1000000 + j * 1000 + k};
    sort(num + 1, num + tot + 1);
    printf("tot = %d\n", tot);
    for (int i = 2; i <= tot; ++i)
        if (num[i].first != num[i - 1].first) mp[num[i].first] = i;

    // 2 + 5
    LL tmp = (a[notpos[2]] + a[notpos[5]]) % mod;
    for (int i = 1; i <= n; ++i) {
        for (int j = i + 1; j <= n; ++j)
            for (int k = j + 1; k <= n; ++k)
                for (int l = k + 1; l <= n; ++l) {
                    LL need = (goal - (tmp + a[i] + a[j] + a[k] + a[l]) % mod + mod) % mod;
                    if (mp[need] > 0) {
                        printf("%lld + %lld + %lld + %lld + %lld + %lld + %lld\n",
                        a[notpos[2]], a[notpos[5]], a[i], a[j], a[k], a[l], need);
                        printf("%d %d %d %d %d %d %d\n",
                        notpos[2], notpos[5], i, j, k, l, num[mp[need]].second);
                    }

                }
        printf("%d finished\n", i);
    }

    // 4 + 5 + 8


    // 2 + 4 + 5 + 6


    return 0;
}

最后就可以得到7个数:2144397255, 2450739720, 2859196340, 3027384360, 3958887240, 553392840, 1171109940, 1559561640, 857758902

 

按照索引从小到大排序就是17, 27, 60, 97, 133, 161, 243, 292, 309,按照格式输入即可。


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞3
打赏
分享
最新回复 (3)
雪    币: 44
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
actor刘 2018-12-5 11:36
2
0
tql
雪    币: 8270
活跃值: (4786)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
v0id_ 2019-9-8 10:45
3
0
牛逼 
雪    币: 256
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
w. 2019-9-19 15:20
4
0
tql
游客
登录 | 注册 方可回帖
返回