wargame简单入门

1 学会用wargame加快学习效率

​ 简单的wargame可以理解成一种解题。提供对所学知识简单的练习与巩固。最近花了一些时间在这两个wargame上面。

overthewire

exploit-exercises

​ 在进行wargame练习之前需要 需要简单了解一下wargame的流程,以及一些需要的工具。

  • wargame会分成不同的level,过关的方法其实就是通过当前账号登陆之后的一些操作来获取下一个level账号的密码
  • 工具

​ 在进入wargame的练习之前,需要了解一些工具来帮助问题的解决。

python

​ 在做缓冲区溢出时会需要从shell输入一些二进制数据,这时就可以通过python来构造。例如我们需要40个字节长有’A’组成的字符串。那么只需要如下一段python脚本就可以获得了。

python -c ‘print “A”*40’

gdb

​ 1. r < file

​ 在程序需要接受标准输入时(get,scanf等函数),从file文件中读取

​ 2. disas main

​ 查看main函数的汇编代码,如果需要看其他函数写入相应的函数名就好

​ 3. p /x $esp

​ 以16进制的形式查看esp寄存器中的值

​ 4. x /100x $esp

​ 查看从$esp指向的地址开始往后100个64位的16进制数

​ 5. b *0x12345678

​ 在某处下断点。

2 简单的栈溢解题思路与扩展

​ 刚刚接触栈溢出可能会被一些略微复杂的底层原理搞晕,或者直接面对比较难的一些漏洞分析文章无从下手而失去信心。我们就可以从简单的wargame开始一个level一个level的做下去,巩固知识以及加强信心

第一式 投石问路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdlib.h"
#include "unistd.h"
#include "stdio.h"
#include "string.h"

void win()
{

printf("code flow successfully changed\n");
}

int main(int argc, char **argv)
{

char buffer[64];
gets(buffer);
}

​ 这种情况呢可以什么都不管直接往buff里写数据,一直写到程序崩溃。

1
2
3
user@protostar:/tmp$ bin/stack4 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Segmentation fault

​ 使用gdb查看再试一次。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
user@protostar:/tmp$ gdb bin/stack4 
GNU gdb (GDB) 7.0.1-debian
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /opt/protostar/bin/stack4...done.
gdb$ r
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB

Program received signal SIGSEGV, Segmentation fault.
--------------------------------------------------------------------------[regs]
EAX: 0xBFFFF720 EBX: 0xB7FD7FF4 ECX: 0xBFFFF720 EDX: 0xB7FD9334 o d I t s Z a P c
ESI: 0x00000000 EDI: 0x00000000 EBP: 0x41414141 ESP: 0xBFFFF770 EIP: 0x41414141
CS: 0073 DS: 007B ES: 007B FS: 0000 GS: 0033 SS: 007BError while running hook_stop:
Cannot access memory at address 0x41414141
0x41414141 in ?? ()
buff的地址 不知到是什么 EIP 不知道是什么
0x41414141 0x41414141 0x41414141 0x41414141 0x41414141 0x42424242

​ EIP的值为0x41414141。就是我们写入的字符串“AAAA…”的值,说明字符串已经覆盖了EIP,那么我们只需要减少A的个数来找到使程序不崩溃的那个边界值就是我们下一步的目标。

1
2
3
4
5
6
7
8
9
10
gdb$ r
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB

Program received signal SIGSEGV, Segmentation fault.
--------------------------------------------------------------------------[regs]
EAX: 0xBFFFF720 EBX: 0xB7FD7FF4 ECX: 0xBFFFF720 EDX: 0xB7FD9334 o d I t s Z a P c
ESI: 0x00000000 EDI: 0x00000000 EBP: 0x41414141 ESP: 0xBFFFF770 EIP: 0x42424242
CS: 0073 DS: 007B ES: 007B FS: 0000 GS: 0033 SS: 007BError while running hook_stop:
Cannot access memory at address 0x42424242
0x42424242 in ?? ()

buff的地址 不知到是什么 EIP 不知道是什么
0x41414141 0x41414141 0x41414141 0x42424242 不知道是什么 不知道是什么

​ 尝试的过程就是减少A的个数直到EIP变为0x42424242,那么这个时候值需要将BBBB替换成我们想要的地址,那么程序就会跳转我们想要执行的地方去了。

这只是这一题的思路

​ 刚刚说的只是一种方法,或者说是一种招式,而其中的内涵与深层的含义,才是我们需要学习的。打个不恰当的比方,就好比武功的招式和心法。而上面所说的方法连招式都算不上,只能说是一种在刚刚接触溢出的时候提高信心的做法,我相信在成功的做出这一题之后,耐下心来看任何一篇简单的栈溢出入门的文章都会更有体会。比如这里

练武不练功到老一场空!本文只是为了让刚刚接触的初学者提高信心,加速对栈溢出最直观的认识,想要在这一篇领域有所作为,扎实的基本功是不可或缺的。一定要阅读栈溢出的基本原理。

​ 下一篇文章会用相同的方法介绍ret2lib。

文章目录
  1. 1. 1 学会用wargame加快学习效率
  2. 2. 2 简单的栈溢解题思路与扩展
    1. 2.1. 第一式 投石问路
  3. 3. 这只是这一题的思路
  4. 4. 练武不练功到老一场空!本文只是为了让刚刚接触的初学者提高信心,加速对栈溢出最直观的认识,想要在这一篇领域有所作为,扎实的基本功是不可或缺的。一定要阅读栈溢出的基本原理。
,