코드를 보니, 스택, binary image? 부분, 그리고 라이브러리 영역이 막혀 있어 보입니다. 근데 한 가지 의문 점이 드는 것은 왜 굳이 라이브러리 영역을 저런 식으로 차단했을까? 라이브러리 영역에 무언가 힌트가 있지 않을까 생각해보고, 살펴보았습니다. 파일 프로세스 maps 파일을 살펴보기 위해 저런식으로 실행시켜 줍니다. maps 파일을 확인해본 결과, \x08, \x40, \xbf 밖에 사용할 수 없다는 것을 알았고, 결과적으로 \x40 즉 라이브러리 영역에 힌트가 있다는 것을 알게 되었습니다. 0x40014000 - 0x40016000 이 부분과 0x40109000 - 0x 4010d000 이 부분을 gdb로 살펴보면 무언가 힌트를 얻을 수 있을 것 같습니다. strcpy 다음부분에 bp를..
코드를 보면, return address 는 strcpy의 주소여야 하고, strcpy의 ret 부분은 사용하지 못하게 해 놓았군요,, 그래서 strcpy 함수 자체의 역할을 이용하여 쉘을 따 보겠습니다. 풀이 방법buffer에 system 함수의 주소 + 더미 + “/bin/sh”를 저장해 둡니다. strcpy 함수의 인자에, ret + 4 과 buffer 의 주소를 넣어 줍니다. 그렇게 하면 ret+4 부분에 buffer 값이 들어가지겠죠? 여기서 중요한 점은 ret+4 부분이 뭐느냐..! 바로 strcpy의 ret 즉, strcpy 함수가 종료되면 돌아갈 주소랍니다! 그렇다면 ret+4 주소에는 buffer 값이 들어있으니 쉘이 따지겠네요! 필요한 것들을 바로 찾으러 갑시다. gdb로 strcpy의..
코드가 되게 깁니다. 하지만 어떻게 보면 되게 간단합니다. 힌트에 함수를 연속 호출하라고 합니다. RTL을 할 때 system + dummy[4] + 인자 1,2,3 … 이런식으로 하죠? 여기서 dummy 가 바로 system 함수의 return address 입니다. 즉, 이 주소를 계속 다음 함수의 주소로 바꾸어 주면 MO함수 까지 도달 할 수 있을 것 같습니다. 필요한 함수들의 주소를 찾습니다. 함수들의 return address를 계속 다음 함수의 주소로 바꾸어주고 마지막 MO함수에서는 *cmd 라는 인자값을 통해서 system 함수를 실행시키기 때문에 인자를 넣어주어야 해서 /bin/sh 의 주소를 찾아야합니다. /bin/sh 의 주소는 0xbffffaac 가 되겠네요! BBBB 즉, 62626..
이제는 ret sled 까지 사용을 못하게 되었네요. 이럴땐 FakeEBP라는 기법을 사용할 수 있습니다. FakeEBP 기법의 원리를 설명해드리자면 FPO와 같이 함수 에필로그의 원리를 이용하는 것입니다. SFP를 buf-4 주소로 바꾸어주고 RET은 leave-ret Gadgetd 을 사용하는 겁니다. 한마디로 말하자면 함수 에필로그를 두번하는 것이라고 볼 수도 있겠습니다. 먼저 버퍼의 구조는 이렇게 구성될 것입니다. 함수 에필로그에서 mov esp, ebp를 하게되면 esp가 ebp쪽으로 쭉 당겨져 옵니다. 그리고 sfp 를 buf-4 주소로 바꾸어주고 pop ebp를 하게되면 ebp는 buf-4주소로 갈것이고, esp는 esp+4 부분을 가리키게 될 것입니다. 그리고 ret을 할 때 retrun ..
코드를 보니 스택영역도, 라이브러리 영역도 사용하지 못하게 되었다. 아무래도 평범한 방법으로는 풀 수 없을 것같다. 어쩌면 내부에 있는 어셈블리 명령어를 사용하여 쉘을 딸 수 있지 않을까 생각해보자. ret을 여러번해서 쉘코드의 주소에 도달하게 한다면? 쉘이 따일 것 같다. 이것을 ret Sled 라고 부른다. ret 의 주소를 구해보았다. 0x0804851e 그리고 쉘의 주소로 가게하려면 여러방법이 있겠지만 간편하게 환경변수를 사용하겠다. 만들어주고, 주소를 찾는 코드를 작성해 실행시켰다. 바로 페이로드 구성해준 다음에 익스플로잇 시키면 된다.
코드가 상당히 긴데, 우리가 집중적으로 봐야할 것은 execve 함수를 무조건 사용해야만 한다는 점이다. execve 함수를 사용하기 위해 gdb로 execve 함수의 주소값을 찾았다. 그리고 execve 함수의 사용법을 알아야하는데, execve 함수에는 인자가 3개가 들어간다. 파일이름 , argv * [] , 환경변수 이렇게 인자 3개가 들어간다. 그래서 파일이름은 “/bin/sh” 로 바꾸어주고 argv * [] 는 포인터 배열이여서 끝에 \x00 즉 NULL이 들어가야한다. 그리고 환경변수는 사용을 하지 않을 것이기 때문에 NULL로 채워 준다. 무엇을 구해야하는지 알았으니, 구해보도록 하자. “/bin/sh” 주소를 구하는 코드이다. “/bin/sh” 주소 -> 0x400fbff9 파일을 복사..
코드를 보면 이제 스택영역을 사용할 수 없게 되었습니다. RTL이라는 기법을 사용합니다. RTL 을 사용하기 위해 system 함수의 주소를 알아냅니다. 그리고 system 함수의 인자로 “/bin/sh” 를 사용할 것이기 때문에 “/bin/sh”의 주소를 찾아주는 코드를 작성합니다. “/bin/sh” 의 주소를 알아냈습니다. 0x400fbff9 payload 구성은 | buffer [40] | SFP [4] | RET(system 함수주소)[4] | Dummy [4] | 인자(“/bin/sh”)[4]| 로 구성됩니다. system 함수 주소와 “/bin/sh” 사이에 왜 더미가 생기는지 궁금하시면FTZ Level11 (RTL) 편을 보시면 됩니다. 쉘이 따인것을 확인 할 수 있습니다.
코드를 살펴보면 main은 마지막에 problem_child 함수를 부르고 끝내는 것을 알 수 있다. 그리고 problem_child 함수는 버퍼는 40만큼 생성하는데 strncpy로 41byte 만큼 버퍼에 복사시키는 것으로 보아 여기서 1byte Overflow가 발생한다는 것을 알 수 있다. 하지만 그렇게 되면 우리는 RET의 주소를 변경시키지 못하게 되는데, 이때 사용할 수 있는 기법이 FPO 이다. 함수가 시작할 땐 함수 프롤로그, 종료될 땐 함수 에필로그가 된다. 함수 에필로그의 구성은 leave와 ret으로 구성되어 있다. leave 는 mov esp ebp, pop ebp 를 수행한다. 즉, esb를 ebp 로 쭉 잡아 땡기고 ebp를 pop 시킨다. ebp가 pop이 되면 esp는 +4의..
코드를 보니 스택 영역을 다 초기화 시킵니다.. 그렇다는 말은 buffer, argv, env 같은 스택 영역에서는 공격을 할 수 없다는 말이됩니다. 단도 직입적으로 말하면 이 문제는 공유라이브러리 영역을 사용하여 문제를 풉니다. 공유 라이브러리 영역이란 프로그램이 시작되기 전 심볼들을 로드하여 필요할 때마다 사용하는 동적 라이브러리 입니다. 임의의 실행파일을 공유 라이브러리를 사용하여 컴파일 하면, 링커가 실행파일에 ‘이 파일이 실행될 때 이 라이브러리를 로딩한다.’ 라는 표시를 해둡니다. 파일이 실행되어 공유 라이브러리를 사용하면, 그 후 공유 라이브러리를 사용하는 모든 프로그램은 만들어진 라이브러리를 사용하게 됩니다. LD_PRELOAD 라는 환경변수를 통하여 라이브러리를 공유 라이브러리 영역에 올..
전 코드의 77자는 사라지고 argc 가 2개인지 검사하네요. 이제 argv[2] 를 이용한 공략은 불가합니다. 그리고 argv[1] 은 0으로 초기화 되네요. 그렇다면 argv[0] 을 사용하라는 의미가 됩니다. 파일을 복사해주고 gdb로 argv[0] 을 포함하게 실행시킵니다. 0xbffffc92 에 argv[0] 의 값이 들어가 있는 것을 볼 수 있습니다. 이 주소를 토대로 페이로드를 구성하면 되겠습니다. 실행파일의 이름을 NOP과 쉘코드를 포함하게 바꾸어 줍니다. 이때 이름이 바뀌지 않는 부분이 있는데 바로 ‘/’ 가 포함 되어 있는 쉘코드를 사용해서 그렇습니다. 폴더이름에는 ‘/’ 가 들어갈 수 없습니다. 따라서 ‘/’ 2f 가 포함되지 않은 쉘코드를 사용하여 이름을 바꿔줍시다. 2f 가 포함되..
- Total
- Today
- Yesterday
- picoctf
- 포너블
- Codegate
- protostar
- 리버싱
- 파이썬
- Python
- darkknight
- lob
- Golem
- 0ctf
- Nightmare
- Pwnable.kr
- babyheap
- 비교 연산자
- angry_doraemon
- 클래스
- ftz
- luckyzzang
- C언어
- bugbear
- 올리디버거
- babypwn
- OllyDbg
- BaskinRobins31
- TAMUCTF
- orge
- succubus
- HarekazeCTF
- zombie_assassin
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |