首页
社区
课程
招聘
[原创][R.S.T]第一课题作业
发表于: 2008-8-23 21:57 9759

[原创][R.S.T]第一课题作业

2008-8-23 21:57
9759
这里把我们第一课题的作业也公布出来,希望能动员全论坛的高手,让我们一起进步!
题目是我出的,由于本人比较菜,所以,出题也借用了别人的程序!
但是希望大家能够喜欢!
具体的作业要求,大家可以看附件!

提交作业的内容包括:
原先未修改的程序,自己修改过后的程序以及修改程序时的修改纪录!
作业的提交方式:就是跟在这个信的后面提交,不要另发新主题!
(任何人都可以参与,相互交流提高!)

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (20)
雪    币: 238
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
对第一题的简单修改。(不知符不符合要求
上传的附件:
2008-8-24 11:02
0
雪    币: 65
活跃值: (811)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
3
我没有找到你修改的地方在哪里!

大家在交作业的时候,注意要求哦~
提交作业的内容包括:
原先未修改的程序,自己修改过后的程序以及修改程序时的修改纪录!
作业的提交方式:就是跟在这个信的后面提交,不要另发新主题!
2008-8-24 11:19
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我来凑下热闹
上传的附件:
  • 1.rar (30.32kb,31次下载)
2008-8-24 16:18
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不知道行不行
上传的附件:
2008-8-24 18:50
0
雪    币: 65
活跃值: (811)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
6
很感谢你能参加这次活动!
你为什么不进一步的把程序改写呢,比如把这个CM改成KEYfile验证方式之类的!
2008-8-25 12:06
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
如图   ·······
上传的附件:
2008-8-25 14:38
0
雪    币: 258
活跃值: (16)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
只改了printf上面那一点

00401020  /$  E8 DBFFFFFF   call    00401000
00401025      EB 0F         jmp     short 00401036      //跳转到空白处
00401027  |>  68 34804000   push    00408034                         ;  ASCII "m=%d",LF
0040102C  |.  E8 26000000   call    00401057
00401031  |.  83C4 08       add     esp, 8
00401034  |.  C3            retn
00401035  |   90            nop
00401036      8B5C24 F8     mov     ebx, dword ptr [esp-8]   //把t的内容放到EBX
0040103A      90            nop
0040103B      90            nop
0040103C      53            push    ebx                      //EBX入堆栈
0040103D    ^ EB E8         jmp     short 00401027           //继续回去执行printf
上传的附件:
2008-8-25 21:03
0
雪    币: 258
活跃值: (16)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
功能同样是让MESSAGEBOX显示出输入的数据
方法不同,中间没用的,我全部NOP掉了, 影响视觉

004010A6   .  6A 0B         push    0B                               ; /Count = B (11.)
004010A8   .  50            push    eax                              ; |Buffer
004010A9   .  68 E8030000   push    3E8                              ; |ControlID = 3E8 (1000.)
004010AE   .  51            push    ecx                              ; |hWnd
004010AF   .  FF15 28204000 call    dword ptr [<&USER32.GetDlgItemTe>; \GetDlgItemTextA
004010B5   .  8D5424 00     lea     edx, dword ptr [esp]
004010B9   .  8D4424 08     lea     eax, dword ptr [esp+8]
004010BD   .  90            nop
004010BE   .  90            nop
004010BF   .  90            nop
004010C0   .  90            nop
004010C1   .  90            nop
004010C2   .  90            nop
004010C3   .  90            nop
004010C4   .  90            nop
004010C5   .  90            nop
004010C6   .  90            nop
004010C7      6A 01         push    1       //换个风格
004010C9   .  90            nop                                      ; |
004010CA   .  90            nop                                      ; |
004010CB   .  68 30304000   push    00403030                         ; |Title = "OK!"
004010D0   .  50            push    eax     //输入的内容放在这里     ; |Text
004010D1   .  90            nop                                      ; |
004010D2   .  90            nop                                      ; |
004010D3   .  90            nop                                      ; |
004010D4   .  90            nop                                      ; |
004010D5   .  6A 00         push    0                                ; |hOwner = NULL
004010D7   .  FF15 24204000 call    dword ptr [<&USER32.MessageBoxA>>; \MessageBoxA
上传的附件:
2008-8-25 22:45
0
雪    币: 258
活跃值: (16)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
另外有个问题

我想往空间里面写入信息,用以下方法,空间中显示的是乱码
mov [一个无用地址],eax            ;eax的值是123
2008-8-25 22:47
0
雪    币: 208
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
我写第二题吧,第一题暂时不写了,今天刚刚加入的群,多谢美丽の破船放我进去了.呵呵.这里我写下我做第二题的思路吧.

首先用IDA载入.很快就把结构分析出来了.核心代码就这两个SUB程序.:

text:00401020 _main           proc near               ; CODE XREF: start+AFp
.text:00401020                 call    sub_401000
.text:00401020
.text:00401025                 push    0
.text:00401027                 push    offset s_MD     ; "m=%d\n"
.text:0040102C                 call    sub_401057
.text:0040102C
.text:00401031                 add     esp, 8
.text:00401034                 retn
.text:00401034
.text:00401034 _main           endp

上面是main函数,从上面看在00401020地方先CALL了个子程序.也就是test函数了.在IDA里直接双击进入test函数显示如下:

这个是test函数
sub_401000      proc near               ; CODE XREF: _mainp
.text:00401000
.text:00401000 var_4           = dword ptr -4
.text:00401000
.text:00401000                 push    ecx
.text:00401001                 lea     eax, [esp+4+var_4]
.text:00401005                 mov     [esp+4+var_4], 0 ; 401000给局部变量分配空间
.text:00401005                                         ; 再是按址赋值为0
.text:0040100D                 push    eax             ; &t压栈
.text:0040100E                 push    offset s_D      ; "%d"
.text:00401013                 call    _scanf
.text:00401013
.text:00401018                 add     esp, 0Ch        ; 平衡堆栈
.text:0040101B                 retn
.text:0040101B
.text:0040101B sub_401000      endp

这里我把该函数的每句说明一下.
首先是push ecx是用来给局部变量开辟空间的.此时栈顶就成了esp-4
然后再用lea传地址,用mov把0赋给建立的局部变量.这样堆栈顶的内容就成了0.这里完成了局部变量的初始化工作.
然后是push eax,注意经过这一步后,堆栈变成了esp-8并且栈顶的值为局部变量的有效地址.然后是push    offset s_D
call    _scanf
这两步完成的是输入操作.注意在scanf和printf函数是需要自行平衡堆栈的,所以在其后紧跟一句
add     esp, 0Ch        
注意了,因为在push eax 后又有了一句push    offset s_D 所以平衡堆栈就得是add     esp, 0Ch   了.然后是retn子函数的返回.

在子函数返回后,此时的堆栈栈顶回复到了调用它之前的状态,在理论上来说在该栈顶以上的部分数据没用了,不过这些数据却还是可以调用的.注意我在上面说了.在子函数中的push eax这一句里是esp-8的地方保存的局部变量的有效地址.那么OK在返回了主函数后,只要我们把局部变量的有效地址传给主函数里的一个变量,然后调用printf不就可以达到输入输出相等了吗?

不知道上面我的表述是否大家能明白.如果不明白的建议自己写两个子函数然后跟踪下堆栈.这样就能明白
push ebp
mov ebp,esp
的意思了.好了闲话不多说,这里开始正式干活.用OD载入第二题.我们用IDA里已看到了.MAIN函数的开始地址是00401020.那么我们就直接ctrl+g输入地址直接到达我们主函数

看到如下:
00401020  /$  E8 DBFFFFFF   call    00401000
00401025      6A 00         push    0
00401027      68 34804000   push    00408034                         ;  ASCII "m=%d",LF
0040102C  |.  E8 26000000   call    00401057
00401031  |.  83C4 08       add     esp, 8
00401034  \.  C3            retn
00401035      90            nop
00401036      90            nop
00401037      90            nop
00401038      90            nop
00401039      90            nop
0040103A      90            nop
0040103B      90            nop
0040103C      90            nop
0040103D      90            nop

前面的几行是不是跟我们在IDA里看到的很像呢?那么就开始行动吧.我们知道
00401025      6A 00         push    0
就是传入给输出函数的值.那么如果我们把它改成test函数里的局部变量.这不就达到了题目的要求了嘛?所以呢我们就需要把局部变量的值给它传过去.我们观察到在401035到103D有着一大堆的空地方.那么我们就有效的利用起它.直接在
00401025      6A 00         push    0
上按回车进行汇编.
改成
jmp     short 00401035
然后到00401035
的地方用如下:
push    dword ptr [esp-8]
OK现在我们输入的数已经压栈了.那么就继续跳回原来的地址继续执行.所以在后面加下面这句:
jmp     short 00401027

这样就实现了我们的目的了,试验运行下成功.然后就是复制修改部分到文件了.此题顺利完成.

完整的修改代码如下(注意红色部分):

00401020  /$  E8 DBFFFFFF   call    00401000
00401025  |.  EB 0E         jmp     short 00401035
00401027  |>  68 34804000   push    00408034                         ;  ASCII "m=%d",LF
0040102C  |.  E8 26000000   call    00401057
00401031  |.  83C4 08       add     esp, 8
00401034  |.  C3            retn
00401035  |>  FF7424 F8     push    dword ptr [esp-8]
00401039  \.^ EB EC         jmp     short 00401027

0040103B      90            nop

可能有些人在看了上面的后会有以下的疑问:
1.为什么不直接修改00401025处为push    dword ptr [esp-8],而是要跳到一个空区呢?

解答:大家注意输入这段后OD里的变化为:
00401035  |> \FF7424 F8     push    dword ptr [esp-8]


00401025      6A 00         push    0
这里可以看到它的机器码长度明显大于原来的.所以这也是我为什么不直接在00401025 修改而要
跳到一个空白区进行操作的原因.

2.是否可以把[esp-8]的值传给某一个寄存器然后用push某一个寄存器呢?

解答:这是可以的.不过因为要考虑到要保持各寄存器的值的问题,在用寄存器保存值时记得事先要把原有的值压入堆栈,完成后还要记得保持平衡,因为要考虑比较多的东西,我这里就不那么麻烦,直接把值压入堆栈了.

最后把我修改后的发上来,算是交作业了.不知道是否能算我过关啊^^
第二题交作业.rar
上传的附件:
2008-8-25 23:13
0
雪    币: 65
活跃值: (811)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
12
“抛砖引玉”,大家的答案越来越精彩了,希望能有更好的答案!
希望大家能认真的做一下第一题,毕竟第一题才锻炼人的水平!
我们可以比赛一下,谁改的CM最精彩!
2008-8-26 09:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
随便写的,大家见笑啦。。。
2008-8-26 22:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
忘传啦,呵呵
上传的附件:
2008-8-26 22:53
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
2008-8-27 14:13
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
00401020  /$  E8 DBFFFFFF   call    00401000                         ;  TEST
00401025      FF7424 F8     push    dword ptr [esp-8]
00401029      68 34804000   push    00408034                         ;  ASCII "m=%d",LF
0040102E      E8 24000000   call    00401057
00401033      83C4 08       add     esp, 8
00401036      C3            retn

上传的附件:
2008-8-28 20:30
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
应用笔记的程序:    CrackMe                        By Fgyg    @  2008-09-03 1:00:00

功能:
准备把用户输入的字符串中的小写字母,全部转换成大写字母,并输出。

修改过程如下:

用OD载入程序,找到最后一个输出对话框调用:

004010F4    FF15 24204000   CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; USER32.MessageBoxA

前面不用的代码全NOP掉:
004010BD    52              PUSH EDX
004010BE    50              PUSH EAX
004010BF    FF15 04204000   CALL DWORD PTR DS:[<&KERNEL32.lstrcmpA>] ; kernel32.lstrcmpA
004010C5    85C0            TEST EAX,EAX
004010C7    6A 00           PUSH 0
004010C9    75 1D           JNZ SHORT CrackMe.004010E8
004010CB    68 30304000     PUSH CrackMe.00403030                    ; ASCII "OK!"
004010D0    68 24304000     PUSH CrackMe.00403024
004010D5    6A 00           PUSH 0
004010D7    FF15 24204000   CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; USER32.MessageBoxA
004010DD    B8 01000000     MOV EAX,1
004010E2    83C4 14         ADD ESP,14
004010E5    C2 1000         RETN 10

因为其中NOP掉了对话框函数的第一个参数PUSH 0
在这条语句
004010E8    68 1C304000     PUSH CrackMeN.0040301C                   ; ASCII "ERROR!"
前面补上
004010E6    6A 00           PUSH 0

然后加入以下代码,完成输入字符串的大小写转换:
004010BD    8A18            MOV BL,BYTE PTR DS:[EAX]
004010BF    80FB 00         CMP BL,0
004010C2    74 22           JE SHORT CrackMeN.004010E6
004010C4    80FB 61         CMP BL,61
004010C7    72 08           JB SHORT CrackMeN.004010D1
004010C9    80FB 7A         CMP BL,7A
004010CC    77 03           JA SHORT CrackMeN.004010D1
004010CE    8020 DF         AND BYTE PTR DS:[EAX],0DF
004010D1    40              INC EAX
004010D2  ^ EB E9           JMP SHORT CrackMeN.004010BD

最后修改输出对话框的文本内容,直接定位:
004010ED    FF7424 E8       PUSH DWORD PTR SS:[ESP-18]

这样就OK了。
上传的附件:
2008-9-3 02:05
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
18
要想玩花样的话就自己写一个DLL,然后在按键事件里面PATCH一个,让它引用我们的DLL中函数,有了外部的DLL想玩什么就玩什么
2008-9-5 19:53
0
雪    币: 196
活跃值: (96)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
19
]//第一个crackme,用SetDlgItemText把crackme变成了keygen,修改成以下代码就ok
[CODE004010E8   >>lea     edx, dword ptr [esp+4]
004010EC   .>push    edx                              ; /Text
004010ED   .>push    3E8                              ; |ControlID = 3E8 (1000.)
004010F2   .>mov     ecx, dword ptr [esp+24]          ; |
004010F6   .>push    ecx                              ; |hWnd
004010F7   .>call    USER32.SetDlgItemTextA           ; \SetDlgItemTextA
004010FC   .>inc     eax     ; 原来是mov eax, 1
004010FD   .>nop
004010FE   .>nop
004010FF   .>add     esp, 18
00401102   .>retn    10
[/CODE]

第二个
00401020  /$  >call    00401000                         ;  call test() 返回后esp-8是输入值
00401025  |.  >mov     eax, dword ptr [esp-8]
00401029  |.  >push    eax
0040102A  |.  >push    00408034                         ;  ASCII "m=%d\n"
0040102F  |.  >call    00401057
00401034  |.  >add     esp, 8
00401037  \.  >retn
2008-9-5 22:52
0
雪    币: 6092
活跃值: (654)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
20
顺手修改下呵呵 感觉自己好菜
这个是我的第一题,第二题在思考中

真的不知道修改什么........不符合要求的话 我重新做一个
上传的附件:
2008-9-6 12:07
0
雪    币: 191
活跃值: (58)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
21
004010C7   .  6A 00         push    0                                ; /Style = MB_OK|MB_APPLMODAL
004010C9      90            nop
004010CA      90            nop                                      ;  这里NOP掉,正确的,错误的,都会变成正确的。004010CB   .  68 30304000   push    00403030                         ; |ok!9981
004010D0   .  68 24304000   push    00403024                         ; |恭喜你!
004010D5   .  6A 00         push    0                                ; |hOwner = NULL
004010D7   .  FF15 24204000 call    dword ptr [<&USER32.MessageBoxA>>; \MessageBoxA

SN = 9981
2008-9-13 14:31
0
游客
登录 | 注册 方可回帖
返回
//