ret2shellcode
原理
ret2shellcode,即控制程序shellcode代码。shellcode指的是用于完成某个功能的汇编代码,如:call等,常见的功能主要是获取目标系统的shell。如果想执行shellcode,需要对应的binary在运行时,shellcode所在的区域具有可执行权限。
举例
还是以bammboofox的ret2shellcode为例
附:ret2shellcode
第一步还是进行checksec
giantbranch@ubuntu:~/Desktop/PWN$ checksec ret2shellcode
[*] '/home/giantbranch/Desktop/PWN/ret2shellcode'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x8048000)
RWX: Has RWX segments
可以看到没有开启数据执行保护(NX)和其他的保护措施,并且可读可写可执行的部分存在。
在拖到IDA里面看一下
还是老演员gets先生了~
仍然是最基本的栈溢出漏洞,不过这次害将对应的地府通过strcpy函数复制到buf2中,不妨来看一下buf2
看到buf2在bss段。
看看bss段所在的buf2能否可执行呢?
首先将文件的权限提升一下。
giantbranch@ubuntu:~/Desktop/PWN$ chmod a+x ret2shellcode
giantbranch@ubuntu:~/Desktop/PWN$ gdb ret2shellcode
在main函数设下断点:
gdb-peda$ b main
Breakpoint 1 at 0x8048536: file ret2shellcode.c, line 8.
r查看一下
Starting program: /home/giantbranch/Desktop/ret2shellcode
[----------------------------------registers-----------------------------------]
EAX: 0xf7fb8dbc --> 0xffffd0dc --> 0xffffd2cf ("XDG_VTNR=7")
EBX: 0x0
ECX: 0x245de9ae
EDX: 0xffffd064 --> 0x0
ESI: 0xf7fb7000 --> 0x1b1db0
EDI: 0xf7fb7000 --> 0x1b1db0
EBP: 0xffffd038 --> 0x0
ESP: 0xffffcfb0 --> 0xffffcfde --> 0xffff0000 --> 0x0
EIP: 0x8048536 (<main+9>: mov eax,ds:0x804a060)
EFLAGS: 0x283 (CARRY parity adjust zero SIGN trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
0x804852e <main+1>: mov ebp,esp
0x8048530 <main+3>: and esp,0xfffffff0
0x8048533 <main+6>: add esp,0xffffff80
=> 0x8048536 <main+9>: mov eax,ds:0x804a060
0x804853b <main+14>: mov DWORD PTR [esp+0xc],0x0
0x8048543 <main+22>: mov DWORD PTR [esp+0x8],0x2
0x804854b <main+30>: mov DWORD PTR [esp+0x4],0x0
0x8048553 <main+38>: mov DWORD PTR [esp],eax
[------------------------------------stack-------------------------------------]
0000| 0xffffcfb0 --> 0xffffcfde --> 0xffff0000 --> 0x0
0004| 0xffffcfb4 --