【Reverse】level2_very_success writeup

因为题目还可以做所以不放比赛名称,做个备忘吧~

首先上IDA,前面401000处第一条指令跳过,修复栈平衡。

然后发现验证的函数如下,可以看出这里主要是要逆算法了。

当时室友也在做这题,晚了10分钟解出来,卡在我分析的地方,以后一定记住所见即所得。

把算法捋一下,同时用ollydbg跑,即可看出算法的大致端倪。

----------------------------------code------------------------------------------------

int __usercall [email protected]<eax>(int [email protected]<eax>, int v_0x11, int str, signed int len)

{

__int16 sum; // [email protected]

signed int lenval; // [email protected]

int ptr; // [email protected]

int v7; // [email protected]

char chr; // [email protected]

unsigned int v9; // [email protected]

char v10; // [email protected]

char v11; // [email protected]

__int16 tmprs; // [email protected]

bool equal; // [email protected]

int unuse; // [email protected]

int result_2; // [sp+0h] [bp-Ch]@3

sum = 0;

lenval = 37;

if ( len >= 37 )                              // len > 37

{

ptr = str;                                  // v7 = 35 at first

v7 = v_0x11 + 36;

while ( 1 )

{

LOWORD(result) = 455;

result_2 = result;

chr = *(_BYTE *)ptr++;

v9 = __readeflags();                      // pushf

v10 = __ROL1__(1, sum & 3);

__writeeflags(v9);                        // popf

tmprs = (unsigned __int8)(v10 + v11 + (result_2 ^ chr));

sum += tmprs;

equal = *(_BYTE *)v7 == (_BYTE)tmprs;     // key

unuse = v7 + 1;

if ( !equal )

LOWORD(lenval) = 0;

result = result_2;

if ( !lenval )

break;

v7 = unuse - 2;                           // v7 = v7 - 1

--lenval;

if ( !lenval )

return result;

}

}

return 0;

}

-----------------------------------------code---------------------------------

len=37

[email protected]

sum=0

while(1){

chr = str(ptr)

tmprs = (__ROL1__(1, sum & 3) + xxxtmprs_low_bitxxx 应该是1! + (455 ^ chr));

sum += tmprs; //we known the value of tmprs and sum

if(*value != tmprs) break;

value--

ptr++

len--

if(!j) return 1

}

接下来算法就好写了。

-------------------------------------code--------------------------

sumv = 0

lenv = 37

rolv = 1

flag = 1

result = ‘‘

values = [0xa8,0x9a,0x90,0xb3,0xb6,0xbc,0xb4,0xab,0x9d,0xae,0xf9,0xb8,0x9d,0xb8,0xaf,0xba,0xa5,0xa5,0xba,0x9a,0xbc,0xb0,0xa7,0xc0,0x8a,0xaa,0xae,0xaf,0xba,0xa4,0xec,0xaa,0xae,0xeb,0xad,0xaa,0xaf,]

for i in range(37):

rolv = (1 << (sumv & 3)) % 256

code = (455 ^ (values[i] - rolv - flag)% 256) %256

result = result + chr(code)

sumv = sumv + values[i]

print result

时间: 2024-10-25 09:33:34

【Reverse】level2_very_success writeup的相关文章

【Reverse】GDB的使用(实例)

有小伙伴提到GDB的使用问题,记得有一篇文章结合实例讲解很不错,可惜没有出处(好吧是我懒得找233)贴上来吧~ GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能.所谓"寸有所长,尺有所短"就是这个道理. 一般来说,GDB主要帮忙你完成下面四个方面的功能: ??? 1.启动你的程序,可以按照你的自定义的要

【Reverse】Take the maze from bugku

三晚的盲逆....赶脚这个票是假的 让我想想.....!!! !!!! !!!!! ........................................................................................ 我就知道..... 算了,不玩了,写完作业在搞吧....... 我默默的合上了笔记本,打开了<Linux内核原理与分析><构建之法><深入理解计算机系统><图解TCP/IP><信息安全技术概论&

【bugku】【RE】file WriteUp

FILE 查壳后显示无壳,拖进IDA: 运行程序时传递的第一个参数为一个文件名,并打开该文件.下面点进去encode函数分析一下: for循环中每三个为一组,进行Base64的操作,接下来两个if分别判断Base64后的尾部是加一个“=”还是两个“=”还是不加“=”.具体Base64编码方式可以参考我的这篇博客:https://www.cnblogs.com/reddest/p/9554948.html.所以encode()是对传入的字符串进行Base64编码.回到主函数看看encode()被用

【Bugku】计算器 WriteUp

话不多说,先打开题目 老套路,先看hint,发现并没有 然后打开题目链接  http://123.206.87.240:8002/yanzhengma/ 验证码? 首先试着把正确答案输进去 问题来了,输入框里最多只能输入个位数 然后又是习惯的看了一下源码(用F12开发人员工具打开的) 发现输入框的最大字符数量有限制 然后尝试把1修改到3 再去输入一下正确答案 Flag就出来了 解题思路:修改标签中的最大字符数 原文地址:https://www.cnblogs.com/FeatherStark/p

【leetcode】Reverse Words in a String

问题:给定一个字符串,字符串中包含若干单词,每个单词间由空格分隔,将单词逆置,即第一个单词成为最后一个单词,一次类推. 说明:字符串本身可能包含前导空格或后导空格,单词间可能包含多个空格,要求结果中去掉前导和后导空格,单词间空格只保留一个. 与rotate函数类似,先逆置每个单词,再将所有字符串逆置. void reverseWords(string &s) { if(s.size() == 0) return; char blank = ' '; size_t len = s.size();

【leetcode】Reverse Words in a String (python)

陆陆续续几个月下来,终于把题刷完了,过程中遇到的python的题解很少,这里重新用python实现下,所以题解可能都是总结性的,或者是新的心得,不会仅针对题目本身说的太详细. def reverseWords(self, s): s = ' '.join(s.split()[::-1]) return s [ : :  -1 ] 是将元素进行翻转 [leetcode]Reverse Words in a String (python),布布扣,bubuko.com

【leetcode】:Evaluate Reverse Polish Notation (python)

逆波兰式的求解,建立一个类栈容器,遍历给定的逆波兰表达式,遇到数字就push, 遇到操作符就进行出栈,连续出两次,因为给定的四则运算符都是双目的,这里注意下这两个操作数的先后顺序,因为对于加法和乘法没关系,但是对于减法和除法是有先后关系的.然后进行相应的运算,将结果push进栈中. 这里附带说明下python中进行除法运算与c,java系列中的除法的不同,就是向下取整的问题.这种不同表现在两个操作数符号不同时的情况. 在c 中 3 / -5 = 0,但是在python中, 结果却为 - 1.这种

【LeetCode】Reverse Linked List II

Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1->2->3->4->5->NULL, m = 2 and n = 4, return 1->4->3->2->5->NULL. Note:Given m, n satisfy the following condition:1 ≤ m ≤ n ≤ lengt

【CTF】Reverse CSC2015 120

来源: Cyber Security Challenge 2015 题目:Crackme 类型: Reverse 分数: 120 难度:中(难中易三个级别) 描述: We found this binary, but we lost the password. Please retrieve it for us. 题目链接:https://github.com/ctfs/write-ups-2015/tree/master/cyber-security-challenge-2015/revers