Reversing.Kr writeup

Reserving.Kr writeup
Easy Crack
Easy Keygen
Replace
Easy_ELF

Reversing.Kr writeup

这个网站http://reversing.kr 学习逆向很不错。各个平台的逆向都有,最近在慢慢的刷这些题

Easy Crack

看名字就知道很简单,PEID查壳,拖入OD,找到关键代码

  1. 0040109B|.8B7C2470 mov edi,dword ptr ss:[esp+0x70];|user32.76D1D2B3
  2. 0040109F|.8D442408 lea eax,dword ptr ss:[esp+0x8];|
  3. 004010A3|.50 push eax ;|Buffer=0000000D
  4. 004010A4|.68 E8030000 push 0x3E8;|ControlID=3E8(1000.)
  5. 004010A9|.57 push edi ;|hWnd =0060157E(‘Easy CrackMe‘,class=‘#32770‘)
  6. 004010AA|. FF15 9C504000 call dword ptr ds:[<&USER32.GetDlgItemTe>; \GetDlgItemTextA
  7. 004010B0|.807C240561 cmp byte ptr ss:[esp+0x5],0x61;比较1
  8. 004010B5757E jnz shortEasy_Cra.00401135
  9. 004010B7|.6A02 push 0x2
  10. 004010B9|.8D4C240A lea ecx,dword ptr ss:[esp+0xA]
  11. 004010BD|.6878604000 push Easy_Cra.00406078; ASCII "5y"
  12. 004010C2|.51 push ecx ; user32.76D0B7D6
  13. 004010C3|. E8 88000000 call Easy_Cra.00401150
  14. 004010C8|.83C40C add esp,0xC
  15. 004010CB|.85C0 test eax,eax ;比较2
  16. 004010CD7566 jnz shortEasy_Cra.00401135
  17. 004010CF|.53 push ebx ;Easy_Cra.00401020
  18. 004010D0|.56 push esi ;Easy_Cra.00401020
  19. 004010D1|. BE 6C604000 mov esi,Easy_Cra.0040606C; ASCII "R3versing"
  20. 004010D6|.8D442410 lea eax,dword ptr ss:[esp+0x10]
  21. 004010DA|>8A10/mov dl,byte ptr ds:[eax]
  22. 004010DC|.8A1E|mov bl,byte ptr ds:[esi]
  23. 004010DE|.8ACA|mov cl,dl
  24. 004010E0|.3AD3|cmp dl,bl
  25. 004010E2|.751E|jnz shortEasy_Cra.00401102
  26. 004010E4|.84C9|test cl,cl
  27. 004010E6|.7416|je shortEasy_Cra.004010FE
  28. 004010E8|.8A5001|mov dl,byte ptr ds:[eax+0x1]
  29. 004010EB|.8A5E01|mov bl,byte ptr ds:[esi+0x1]
  30. 004010EE|.8ACA|mov cl,dl
  31. 004010F0|.3AD3|cmp dl,bl
  32. 004010F2|.750E|jnz shortEasy_Cra.00401102
  33. 004010F4|.83C002|add eax,0x2
  34. 004010F7|.83C602|add esi,0x2
  35. 004010FA|.84C9|test cl,cl
  36. 004010FC|.^75 DC \jnz shortEasy_Cra.004010DA
  37. 004010FE|>33C0 xor eax,eax
  38. 00401100|. EB 05 jmp shortEasy_Cra.00401107
  39. 00401102|>1BC0 sbb eax,eax
  40. 00401104|.83D8 FF sbb eax,-0x1
  41. 00401107|>5E pop esi ;Easy_Cra.00401020
  42. 00401108|.5B pop ebx ;Easy_Cra.00401020
  43. 00401109|.85C0 test eax,eax ;比较3
  44. 0040110B7528 jnz shortEasy_Cra.00401135
  45. 0040110D|.807C240445 cmp byte ptr ss:[esp+0x4],0x45;比较4
  46. 004011127521 jnz shortEasy_Cra.00401135
  47. 00401114|.6A40 push 0x40;/Style= MB_OK|MB_ICONASTERISK|MB_APPLMODAL
  48. 00401116|.6858604000 push Easy_Cra.00406058;|Title="EasyCrackMe"
  49. 0040111B|.6844604000 push Easy_Cra.00406044;|Text="Congratulation !!"
  50. 00401120|.57 push edi ;|hOwner =0060157E(‘Easy CrackMe‘,class=‘#32770‘)
  51. 00401121|. FF15 A0504000 call dword ptr ds:[<&USER32.MessageBoxA>>; \MessageBoxA
  52. 00401127|.6A00 push 0x0;/Result=0x0
  53. 00401129|.57 push edi ;|hWnd =0060157E(‘Easy CrackMe‘,class=‘#32770‘)
  54. 0040112A|. FF15 A4504000 call dword ptr ds:[<&USER32.EndDialog>]; \EndDialog
  55. 00401130|.5F pop edi
  56. 00401131|.83C464 add esp,0x64
  57. 00401134|. C3 retn
  58. 00401135|>6A10 push 0x10;/Style= MB_OK|MB_ICONHAND|MB_APPLMODAL
  59. 00401137|.6858604000 push Easy_Cra.00406058;|Title="EasyCrackMe"
  60. 0040113C|.6830604000 push Easy_Cra.00406030;|Text="Incorrect Password"
  61. 00401141|.57 push edi ;|hOwner =0060157E(‘Easy CrackMe‘,class=‘#32770‘)
  62. 00401142|. FF15 A0504000 call dword ptr ds:[<&USER32.MessageBoxA>>; \MessageBoxA

输入Ea5yR3versing(这就是flag)

看到这句话

也就是说,当运行到这里的时候,我们的输入已经入栈,首字符‘E‘存在[esp+0x4]

接下来上面的代码就是不断判断这个字符串各个位置的字符是否和程序中预先写好的一样,一旦有一个地方不一样,就直接跳转到00401135去弹出Incorrect Password窗口。根据程序中硬编码的字符串,拼接出来正确的字符串就是Ea5yR3versing

当然,这道题直接nop掉所有相关跳转也可以暴力破解。

Easy Keygen

win32的程序,无壳,拖入IDA,反编译,看看大概逻辑

  1. int __cdecl main(int argc,constchar**argv,constchar**envp)
  2. {
  3. signedint v3;// [email protected]
  4. signedint i;// [email protected]
  5. int result;// [email protected]
  6. char v6;// [sp+Ch] [bp-130h]@1
  7. char v7;// [sp+Dh] [bp-12Fh]@1
  8. char v8;// [sp+Eh] [bp-12Eh]@1
  9. char v9;// [sp+10h] [bp-12Ch]@1
  10. char v10;// [sp+11h] [bp-12Bh]@1
  11. __int16 v11;// [sp+71h] [bp-CBh]@1
  12. char v12;// [sp+73h] [bp-C9h]@1
  13. char v13;// [sp+74h] [bp-C8h]@1
  14. char v14;// [sp+75h] [bp-C7h]@1
  15. __int16 v15;// [sp+139h] [bp-3h]@1
  16. char v16;// [sp+13Bh] [bp-1h]@1
  17. v9 =0;
  18. v13 =0;
  19. memset(&v10,0,0x60u);
  20. v11 =0;
  21. v12 =0;
  22. memset(&v14,0,0xC4u);
  23. v15 =0;
  24. v16 =0;
  25. v6 =16;
  26. v7 =32;
  27. v8 =48;
  28. sub_4011B9(aInputName);
  29. scanf(aS,&v9);
  30. v3 =0;
  31. for( i =0; v3 <(signedint)strlen(&v9);++i )
  32. {
  33. if( i >=3)
  34. i =0;
  35. sprintf(&v13, aS02x,&v13,*(&v9 + v3++)^*(&v6 + i));// aS02x==>%s%02X,指定了格式,表示长度为两位的16进制显示,并且如果有字母,字母大写
  36. }
  37. memset(&v9,0,0x64u);
  38. sub_4011B9(aInputSerial);
  39. scanf(aS,&v9);
  40. if(!strcmp(&v9,&v13))
  41. {
  42. sub_4011B9(aCorrect);
  43. result =0;
  44. }
  45. else
  46. {
  47. sub_4011B9(aWrong);
  48. result =0;
  49. }
  50. return result;
  51. }

注意sprintf的参数aS02x,通过OD的动态调试,我们可以看到这个参数的具体意思

给出通过name计算serial的注册机代码

  1. name = raw_input()
  2. ordname =[]
  3. for i in range(len(name)):
  4. ordname.append(ord(name[i]))
  5. i =0
  6. v6 =[16,32,48]
  7. serial =[]
  8. for v3 in range(len(ordname)):
  9. if(i>=3):
  10. i =0
  11. serial.append(ordname[v3]^v6[i])
  12. i+=1
  13. flag =""
  14. for i in range(len(serial)):
  15. flag += chr(serial[i])
  16. print(flag.encode("hex").upper())

这个题目的要求是给一个serial,求出name,根据上面的代码,给出通过serial计算name的脚本

  1. serial ="5B134977135E7D13"
  2. serial =[ord(i)for i in serial.lower().decode("hex")]
  3. name =[]
  4. v6 =[16,32,48]
  5. i =0
  6. for v3 in range(len(serial)):
  7. if(i>=3):
  8. i =0
  9. name.append(serial[v3]^v6[i])
  10. i+=1
  11. print(name)
  12. namestr =""
  13. for j in range(len(name)):
  14. namestr+=chr(name[j])
  15. print(namestr)

计算结果K3yg3nm3

Replace

32位的无壳程序,先用IDA看看逻辑和一些字符串

发现有Correct!字符串,追踪交叉引再反编译,这段代码并看不懂。但是我们可以知道了这个关键字符串的地址

在OD中找到这段代码

这是关键代码

  1. 00401050.6A00 push 0x0;/IsSigned= FALSE
  2. 00401052.6A00 push 0x0;|pSuccess = NULL
  3. 00401054.68 EA030000 push 0x3EA;|ControlID=3EA(1002.)
  4. 00401059.56 push esi ;|hWnd =004010B0
  5. 0040105A. FF15 9C504000 call dword ptr ds:[<&USER32.GetDlgItemIn>; \GetDlgItemInt 调用API函数取得输入的内容
  6. 00401060. A3 D0844000 mov dword ptr ds:[0x4084D0],eax
  7. 00401065. E8 05360000 call Replace.0040466F;可以对ds:[0x4084D0]的内容做一个转换
  8. 0040106A.33C0 xor eax,eax
  9. 0040106C E9 1F360000 jmp Replace.00404690;无条件跳转
  10. 00401071 EB 11 jmp shortReplace.00401084
  11. 00401073.683460400>ascii "h4`@",0;Correct!
  12. 00401078.68 E9030000 push 0x3E9;|ControlID=3E9(1001.)
  13. 0040107D.56 push esi ;|hWnd =004010B0
  14. 0040107E. FF15 A0504000 call dword ptr ds:[<&USER32.SetDlgItemTe>; \SetDlgItemTextA

在在输出正确之前,有两个无条件跳转,先看第一个,这是跳转之后的代码

  1. 00404690> \A1 D0844000 mov eax,dword ptr ds:[0x4084D0]
  2. 00404695.689F464000 push Replace.0040469F
  3. 0040469A. E8 EAFFFFFF call Replace.00404689
  4. 0040469F. C705 6F464000>mov dword ptr ds:[0x40466F],0xC39000C6
  5. 004046A9. E8 C1FFFFFF call Replace.0040466F;这里程序报错了
  6. 004046AE.40 inc eax
  7. 004046AF. E8 BBFFFFFF call Replace.0040466F
  8. 004046B4. C705 6F464000>mov dword ptr ds:[0x40466F],0x6E8
  9. 004046BE.58 pop eax ;Replace.0040469F
  10. 004046BF. B8 FFFFFFFF mov eax,-0x1
  11. 004046C4.^ E9 A8C9FFFF jmp Replace.00401071

经过测试,程序在执行004046A9的call Replace.0040466F报错,进入这个函数

  1. 0040466F C600 90 mov byte ptr ds:[eax],0x90
  2. 00404672 C3 retn

这个0x90就是nop指令的16进制表示,也就是说这个指令将ds:[eax]中的指令nop掉,注意上段代码004046C4 .^ E9 A8C9FFFF jmp Replace.00401071就是跳转回这里执行

这就是我上述的第二个无条件跳转点,只要我们用Replace.0040466F将这里的jmp指令nop掉就可以输出Correct了,所以所以说正好调用上这个Replace.0040466F函数。那么接下来我们要解决的问题就是怎么让eax=00401071。追踪eax的调用过程,首先是调用GetDlgItemIntAPI函数取得输入内容放在eax,并将eax赋给 ds:[0x4084D0]。接下来调用Replace.0040466F函数,这个函数对实现了对内存ds:[0x4084D0]的内容进行了某种转换,经过测试,我们可以认为这种转化是输入的值加上0x601605CB,这是输入值为0时,经过函数变换后ds:[0x4084D0]的值

此外此函数还对eax加一。

接着是第一个无条件跳转指令,跳转到00404690执行mov eax,dword ptr ds:[0x4084D0]对eax赋值,接着就是进入Replace.0040466F,执行这句话0040466F C600 90 mov byte ptr ds:[eax],0x90。如果这个的eax=00401071就对了,也就是说我们要这个公式成立input+0x601605CB=0x00401071。如果上述公式成立,那么input一定是负数,但是经过测试此程序只可以输入正数。考虑eax是32位的,也就是说如果input+0x601605CB=0x100401071的话,会产生进位,但是eax=0x00401071。所以input=0x100401071-0x601605CB=2687109798,验证一下,输入上述值是正确的

Easy_ELF

名字已经说的很明确了,Linux下的ELF文件逆向。

逻辑很简单,就是输入字符串,经过变换之后与已知值进行比较。

输入的值L1NUX

时间: 2024-11-01 14:59:37

Reversing.Kr writeup的相关文章

reversing.kr学习之路-ransomeware

ransomeware - writeup 题目来源 http://reversing.kr 题目知识点:upx + 花指令 + 堆栈不平衡 + exe特征码提取key 前言 文章只是记录一下自己在reversing.kr上学习CTF逆向的经历,如果文中出现什么技术错误,烦请各位大佬,在评论中指正.本人技术刚刚入门,菜鸟一枚,大佬勿喷啊- 正文 首先在网站上下载附件,得到一个zip,里面包含了一个txt.一个exe和一个file.根据txt里面的提示,可以得到exe为加密程序,file为加密后的

[Reversing.kr] Easy_KeygenMe Writeup

IDA打开.Main()函数就是关键算法 v6,v7,v8 是连续的 .可看成 L=[16,32,48].输入的name每位分别于L[]异或 得到的值存在v13.然后清空v9的值 ,输入Serial储存在v9  再让v13与v9比较. 可还原算法: #!usr/bin/env python #!coding=utf-8 __author__ = 'zhengjim' name = raw_input() L=[16,32,48] flag ='' for i,name in enumerate(

reversing.kr replace 之write up

好似reversing除了前几个容易些,后面的都很难的.看wp都很困难.首先wp提示crtl+n查看程序所有函数,并且找到了测试函数: 然而宝宝我换了n多个od都没有得到和作者同样的结果: 后来运行程序后再用ctrl+n神奇的出现了: 那我们就按照wp一步一步来:跟进目标函数,我们发现了如下目标函数: f8一直向下执行: 我们发现程序走到这里就执行不下去了,这次我们输入0,观察此时对应的EAX=0x611605cb,于是我们分析得到由于我们输入错误所以eax到了错误的地址,所以eax=输入+0x

reversing.kr easy crack 之write up

之前学逆向感觉学得一踏糊涂,这阶段好多师傅带我,一定要好好学,重新开始,认真学习. 来看打开可执行文件: 用ollydbg载入,单步执行后停到了入口点: 分析入口点,并没有加壳,于是F9执行程序,跳出了程序执行框,随便输入些字符,出现了错误框的提示: F12暂停程序后Alt+k查看调用栈: 补充: MessageBox指的是显示一个模态对话框,其中包含一个系统图标. 一组按钮和一个简短的特定于应用程序消息,如状态或错误的信息.消息框中返回一个整数值,该值指示用户单击了哪个按钮. 在图中高亮处点击

Reversing.kr Position分析题解

先看下程序界面和要求: 76876-77776是固定的数值,要求在空白处输入相应的 字符.要求字符数4个,且最后一个为p.答案不唯一. 1,首先我们查下壳,没有加壳,c++写的程序. 2,使用IDA查看下, 很多这样的函数,让人没有头绪. 3,再使用OD查看下,地址并不是常见的.我们查看下是否有反调试之类的函数. 最常见的函数isdebugerPresen.按下ctrl+N,输入函数 还真有这个函数,使用d fs:[30]+2  使0修改为1,然而并没有什么用. 4,寻找到获取输入的位置,常见的

网络安全学习和CTF的一些网站

http://www.sec-wiki.com/skill/ 安全技能(里面渗透逆向编程都有介绍) http://blog.knownsec.com/Knownsec_RD_Checklist/ 知道创宇研发技能表v3.0 综合学习平台: http://edu.gooann.com/ 谷安网校 http://www.jikexueyuan.com/ 极客学院 http://www.hetianlab.com/ 合天 http://www.moonsos.com/ 米安网 http://www.i

诚意干货:如何神不知鬼不觉破解你家路由器 | 硬创公开课

你见过"僵尸"来袭吗? 你自己也成为其中一个"僵尸"会是怎样的感受? 这次,可能要玩得更酷炫一点! 如果你家路由器被破解,那么就可能是5万僵尸网络中的一员! 带来此次讲座的是一个"别人家的小孩",他目前还在读大三,却已经是长亭科技核心安全团队中的一员.2016年,他和团队在黑客盛会GeekPwn上破解了11款路由器,获得冠军,并拿下42万元奖金. 为什么要聊这个话题? 路由器是互联网络的枢纽--"交通警察".目前路由器已经广泛

【LINUX】pwnable.kr cmd1 writeup

[email protected]:~$ ls cmd1  cmd1.c  flag [email protected]:~$ cat cmd1.c #include <stdio.h> #include <string.h> int filter(char* cmd){ int r=0; r += strstr(cmd, "flag")!=0; r += strstr(cmd, "sh")!=0; r += strstr(cmd, &quo

【LINUX】pwnable.kr cmd2 writeup

试了一晚上终于试出来了....真心曲折,考察linux脚本. 里面需要注意的点如下: 1. Linux里面的sh bash是不一样的,在不同系统上的存在也有不同.sh是为Unix所设计,讲究精简,里面比dash少一些功能,导致调试脚本时很多错了不知道怎么改,一步一步试出来的: 2. 重点在于构造“/”这个东西 3. 到此Toodler's Bottle已经刷完了,我的教程也写到了Lesson 3,接下来的题目writeup很少,我自己做也比较困难,可能转Protostar训练了吧? 前面进展缓慢