首页
社区
课程
招聘
[原创] pwnable.kr刷题日记1 - toddler - fd
2017-12-15 18:11 4733

[原创] pwnable.kr刷题日记1 - toddler - fd

aqs 活跃值
5
2017-12-15 18:11
4733

Said in front

一直想把pwnable.kr 上的题目都刷一遍,一直没有时间, 刚好快要寒假了,
准备开刷,看雪刚好开了pwn版块,嘛,现在开始两个月的时间,把看雪当作
自己的blog来记录吧 ^_^

题目描述

Mommy! what is a file descriptor in Linux?

* try to play the wargame your self but if you are ABSOLUTE beginner, follow this tutorial link: https://www.youtube.com/watch?v=blAxTfcW9VU

ssh fd@pwnable.kr -p2222 (pw:guest)

第一道题目,1 points.挺简单的一道题目,为了练习就直接用汇编来分析,增加自己读汇编的熟练度

analysis

运行题目

❯ ./fd
pass argv[1] a number

要求输入一个参数

❯ ./fd 1234
learn about Linux file IO

输入之后会显示一段字符串
ida打开看看

一个部分一个部分看

 __unwind {
     push    ebp
     mov     ebp, esp
     push    edi
     push    esi
     and     esp, 0FFFFFFF0h
     sub     esp, 20h
     cmp     [ebp+argc], 1    # 判断argc是否 > 1 
     jg      short loc_80484BB  # jmp greate than
     mov     dword ptr [esp], offset s ; "pass argv[1] a number"
     call    _puts    # 没有添加控制台参数输出提示
     mov     eax, 0  
     jmp     loc_8048559 # 跳到结束的位置

首先是需要有控制台参数
有了控制台参数之后跳到下面

loc_80484BB:
                mov     eax, [ebp+argv] 
                add     eax, 4 #eax == 第一个控制台参数地址argv[1]
                mov     eax, [eax] 
                mov     [esp], eax ; nptr
                call    _atoi  # 转换成整数
                sub     eax, 1234h  # 减去 0x1234
                mov     [esp+18h], eax 
                mov     dword ptr [esp+1Ch], 0
                mov     dword ptr [esp+8], 20h ; nbytes
                mov     dword ptr [esp+4], offset buf ; buf
                mov     eax, [esp+18h]  # atoi(argv[1])-0x1234
                mov     [esp], eax ; fd
                call    _read
                            # atoi(argv[1])-0x1234
                            # buf
                            # 0x20

                mov     [esp+1Ch], eax
                mov     edx, offset aLetmewin ; "LETMEWIN\n"
                mov     eax, offset buf
                mov     ecx, 0Ah
                mov     esi, edx
                mov     edi, eax
                repe cmpsb   # strcmp(buf,"LETMEWIN")
                setnbe  dl
                setb    al
                mov     ecx, edx
                sub     cl, al
                mov     eax, ecx
                movsx   eax, al
                test    eax, eax
                jnz     short loc_8048548

到这里就很清楚了
将控制台输入的数字将去 0x1234作为 read 函数的 fd, 后面将buf 和
”LETMEWIN“ 做比较,一样的话就运行下面的代码,直接cat flag 出来

                mov     dword ptr [esp], offset aGoodJob ; "good job :)"
                call    _puts
                mov     dword ptr [esp], offset command ; "/bin/cat flag"
                call    _system
                mov     dword ptr [esp], 0 ; status
                call    _exit

不一样就输出刚才的

loc_8048548:
                mov     dword ptr [esp], offset aLearnAboutLinu ; "learn about Linux file IO"
                call    _puts
                mov     eax, 0

linux 文件描述符 stdin ==> 0
stdout ==> 1
stderr ==> 2
所以控制台输入 0x1234也就是 4660 atoi(argv[1])-0x1234=0
然后就可以写buf, 输入 LETMEWIN 即可

❯ ./fd 4660  
LETMEWIN
good job :)
/bin/cat: flag: 没有那个文件或目录

okay, 第一道题目搞定,虽然很简单,但是还是记录一下,一点一点加大难度


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞1
打赏
分享
最新回复 (3)
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
holing 15 2017-12-15 22:05
2
0
前排围观dalao
雪    币: 2754
活跃值: (346)
能力值: ( LV15,RANK:828 )
在线值:
发帖
回帖
粉丝
aqs 5 2017-12-15 22:45
3
0
菜鸟修行记
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
聖blue 2017-12-16 21:52
4
0
不错!
游客
登录 | 注册 方可回帖
返回