Reversing.kr - AutoHotkey2

2015. 10. 18. 01:20

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.


해커스쿨 문제를 푸는 중 가장 마음에 들면서도 감명받은 문제.

FPO의 개념을 여기서 처음 알았고, 가장 처음 공부할 때 혼자 어떻게 공격할지 엄청 고민하면서 며칠을 보냈고

결국 이해하면서 큰 전율을 느꼈었다.

BoB 면접 때도 이걸로 발표했을 만큼 꽤 좋아하는 공격 방식이다.

이 문제에서는 problem_child라는 다른 함수가 이미 존재하고, 그 안의 버퍼를 넘치게 하는 방식이므로 어려울 것도 없다.

흔히 말하는 1바이트 오버플로우 문제인데, 더미가 없는 관계로 저부분은 바로 SFP이다.

SFP 1바이트를 덮어쓸 수 있고, main 외의 다른 함수 내의 버퍼를 오버플로우 할 수 있다는 말은 FPO의 위험을 가지고 있다는 것이다.

해당 함수의 에필로그 + 메인 함수의 에필로그로 총 두 번의 leave와 ret이 일어나기 때문에 SFP의 변조는 곧 EIP의 변조로 이어질 수 있다.


환경변수에 쉘코드를 올리고 해당 주소를 구한 후 EIP에 들어갈 값인 BUF의 첫 4바이트를 해당 쉘코드의 주소로 주었다.

그리고 마지막 1바이트를 오버플로우 할 때 BUF주소의 -4바이트를 준다.

이 이유는 leave-ret이 한 번 일어나면서 EBP가 변조된 EBP로 이동된 후, 한번 더 leave-ret을 할 때 leave에서 pop ebp를 진행해 버리기 때문에 ret에서 pop을 할 경우 BUF의 첫 4바이트를 참조하게 하기 위함이다.

따라서 마지막 1바이트에서 BUF 주소를 그대로 집어넣으면 BUF의 처음에 4바이트 더미를 주고 쉘코드의 주소를 넣어야 한다.

간단하게 주소를 찾고 공격에 성공하였다.

'Wargame > Lord of Buffer overflow' 카테고리의 다른 글

LOB Redhat : bugbear > giant  (0) 2015.11.03
LOB Redhat : darkknight > bugbear  (0) 2015.11.02
LOB Redhat : skeleton > golem  (0) 2015.10.15
LOB Redhat : vampire > skeleton  (0) 2015.10.15
LOB Redhat : troll > vampire  (0) 2015.10.15
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,



이번엔 skeleton에서 사용했던 방식을 사용할 수 없도록 버퍼에서부터 스택 끝부분까지를 전부 0으로 초기화한다.

이럴 때는 공유 라이브러리에 원하는 코드를 올려서 사용하면 된다.



스택 영역 바로 아랫부분에 공유 라이브러리 영역이 있는 것을 확인할 수 있다.

(이미지 출처 : http://lapislazull.tistory.com/61)

문제에서 0으로 초기화하는 부분은 스택에서 윗부분이므로 아랫부분인 공유 라이브러리 부분은 그대로이다.

아무 컴파일 가능한 c 파일을 하나 만들어서 컴파일을 하는데,

옵션으로 shared와 fPIC를 준다.

shared는 말 그대로 공유 라이브러리를 먼저 참조하라는 의미이고, fPIC는 심볼이 어느 위치에 있건 동작이 가능하도록 컴파일하라는 옵션이라고 한다.

만들어질 파일 명을 NOP와 쉘코드를 포함하여 만들고,

LD_PRELOAD 환경변수에 등록한다.

LD_PRELOAD는 파일 실행 시 Dynamic Linker가 선택된 파일을 무조건 선적재한다.

따라서 이렇게 환경변수에 올려주면 공유 라이브러리로 무조건 해당 파일이 올라온다.

메모리상에서 NOP+SHELLCODE의 주소를 찾아냈고,

해당 주소를 넣어주어 공격에 성공했다.

'Wargame > Lord of Buffer overflow' 카테고리의 다른 글

LOB Redhat : darkknight > bugbear  (0) 2015.11.02
LOB Redhat : golem > darkknight  (0) 2015.10.17
LOB Redhat : vampire > skeleton  (0) 2015.10.15
LOB Redhat : troll > vampire  (0) 2015.10.15
LOB Redhat : orge > troll  (0) 2015.10.13
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,



argv[0]부터 입력한 argv를 모두 0으로 초기화시키는 부분이 붙었다.

심볼릭 링크를 걸어 파일명에 쉘코드를 넣어 주었는데,

실제로 디버깅하며 확인해 본 결과 메모리에 argv[0]은 전부 0으로 초기화된 것을 볼 수 있었다.

하지만 스택의 더 윗부분을 확인하면 이렇게 파일명이 그대로 들어있는 부분을 볼 수 있다.

이는 스택 레이아웃이 argv[0] 말고도 구조상 파일명을 포함하고 있기 때문이다.

https://www.win.tue.nl/~aeb/linux/hh/stack-layout.html

여기에 자세히 나와 있다.

어쨌든 찾은 위치로 리턴시켜 공격에 성공하였다.

'Wargame > Lord of Buffer overflow' 카테고리의 다른 글

LOB Redhat : golem > darkknight  (0) 2015.10.17
LOB Redhat : skeleton > golem  (0) 2015.10.15
LOB Redhat : troll > vampire  (0) 2015.10.15
LOB Redhat : orge > troll  (0) 2015.10.13
LOB Redhat : darkelf > orge  (0) 2015.10.13
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,


이번엔 RET을 덮어씌우는 주소값의 첫 바이트가 '\xbf' 이면서도

두 번째 바이트가 '\xff'일 경우 프로그램을 종료시켜 버린다.

argv[2]를 엄청 많은 값으로 집어넣고 거기로 리턴시켜 공격하기로 했다.

NOP를 대략 10만 개 정도를 주었고,

거기에 집어넣어서 공격에 성공하였다.



'Wargame > Lord of Buffer overflow' 카테고리의 다른 글

LOB Redhat : skeleton > golem  (0) 2015.10.15
LOB Redhat : vampire > skeleton  (0) 2015.10.15
LOB Redhat : orge > troll  (0) 2015.10.13
LOB Redhat : darkelf > orge  (0) 2015.10.13
LOB Redhat : wolfman > darkelf  (0) 2015.10.13
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,



쉘코드에 \x2f가 들어갈 경우 '/' 로 취급해버려 원래 좀 힘든 문제였지만,

이쯤 되니 슬슬 쉘코드를 제작하게 되어 \x2f가 없는 쉘코드를 직접 만들었다.


argv[0]에 집어넣고 거기로 리턴하여 공격하기 위해 NOP+SHELLCODE로 심볼릭 링크를 걸었고,

거기로 리턴하기 위해 몇 번 시도하여 결국 성공하였다.


만들어서 사용한 쉘코드는 다음과 같다.

사용할 사람은 사용하시길.

하지만 setreuid같은 것 없이 간단하게 execve만 하는 소스다 보니 다른 버전의 문제에서는 먹히지 않을 수도 있다.


\x6a\x0b\x58\x99\x52\xbe\x21\x21\x73\x68\x66\x81\xc6\x0e\x0e\x56

\xbe\x2e\x62\x69\x6e\x46\x56\x89\xe3\x52\x53\x89\xe1\xcd\x80

'Wargame > Lord of Buffer overflow' 카테고리의 다른 글

LOB Redhat : vampire > skeleton  (0) 2015.10.15
LOB Redhat : troll > vampire  (0) 2015.10.15
LOB Redhat : darkelf > orge  (0) 2015.10.13
LOB Redhat : wolfman > darkelf  (0) 2015.10.13
LOB Redhat : orc > wolfman  (0) 2015.10.13
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,




여기 또한 마찬가지다.

argv[0]의 길이가 77이어야 한다는데, 그건 심볼릭 링크를 걸어 길이를 늘려 주면 된다.

전과 똑같은 방식으로 공격에 성공했다.

'Wargame > Lord of Buffer overflow' 카테고리의 다른 글

LOB Redhat : troll > vampire  (0) 2015.10.15
LOB Redhat : orge > troll  (0) 2015.10.13
LOB Redhat : wolfman > darkelf  (0) 2015.10.13
LOB Redhat : orc > wolfman  (0) 2015.10.13
LOB Redhat : goblin > orc  (0) 2015.10.13
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,


여기도 전과 똑같은 방식으로 공격이 가능하다.

좀 더 확실히 하기 위해 argv[2]의 주소를 확실히 확인했고,

그 주소로 점프하게 하여 공격에 성공하였다.

'Wargame > Lord of Buffer overflow' 카테고리의 다른 글

LOB Redhat : orge > troll  (0) 2015.10.13
LOB Redhat : darkelf > orge  (0) 2015.10.13
LOB Redhat : orc > wolfman  (0) 2015.10.13
LOB Redhat : goblin > orc  (0) 2015.10.13
LOB Redhat : cobolt > goblin  (0) 2015.10.13
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,


이것도 orc때와 똑같이 풀어주면 되겠다.


버퍼의 주소를 찾고,

대충 NOP+SHELLCODE를 넣어주면 클리어된다.

'Wargame > Lord of Buffer overflow' 카테고리의 다른 글

LOB Redhat : darkelf > orge  (0) 2015.10.13
LOB Redhat : wolfman > darkelf  (0) 2015.10.13
LOB Redhat : goblin > orc  (0) 2015.10.13
LOB Redhat : cobolt > goblin  (0) 2015.10.13
LOB Redhat : gremlin > cobolt  (0) 2015.10.13
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,


이번엔 무조건 주소의 첫 1바이트가 bf가 되어야 하는 것을 보니 스택 영역을 사용할 수밖에 없다.

물론 환경변수를 이용할수도 있지만 이번엔 조금 재미있게 해 봤다.


대충 버퍼의 주소를 찾은 다음,


argv[2]에 NOP를 엄청 많이 주고 뒤에 쉘을 넣어 주는 것으로 쉘코드를 실행시켰다.

이 공격 방식으로 앞으로 몇 문제를 더 풀어낸다.

'Wargame > Lord of Buffer overflow' 카테고리의 다른 글

LOB Redhat : wolfman > darkelf  (0) 2015.10.13
LOB Redhat : orc > wolfman  (0) 2015.10.13
LOB Redhat : cobolt > goblin  (0) 2015.10.13
LOB Redhat : gremlin > cobolt  (0) 2015.10.13
LOB Redhat : gate > gremlin  (0) 2015.10.13
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,