코드를 보니, 스택, 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 라는 환경변수를 통하여 라이브러리를 공유 라이브러리 영역에 올..
환경 변수도 막고 argv[1] 의 길이도 막고 버퍼도 초기화 argv[0]~ argv[넣은 argv 개수 만큼] 다 초기화 된다. 어떻게 접근할지 고민하지말고 일단 무작정 gdb를 키고 스택을 둘러보자. breakpoint 를 걸어서 프로그램이 끝나지 않게 만들고 bf 우회를 피하게 실행을 시킨다. 스택을 돌아다니다가 스택의 끝에 초기화 되지 않은 값을 찾았다. 이 값을 쉘코드로 변경해주고 실행시키면 쉘이 따이지 않을까라고 가정해볼 수 있다. 복사파일의 이름을 nop과 쉘코드가 포함된 문장으로 바꾸어 준다. core dumped 가 된 것을 확인할 수 있다. core 파일을 둘러보다가 또 지워지지 않은 부분이 스택의 끝에 있었다. 원본 파일의 이름을 쉘코드와 nop을 포함한 문장으로 바꾸어준다. 이렇게..
- Total
- Today
- Yesterday
- darkknight
- babyheap
- 파이썬
- HarekazeCTF
- TAMUCTF
- BaskinRobins31
- luckyzzang
- succubus
- 클래스
- Pwnable.kr
- babypwn
- angry_doraemon
- zombie_assassin
- 리버싱
- Golem
- Codegate
- protostar
- 올리디버거
- ftz
- picoctf
- 0ctf
- orge
- lob
- 비교 연산자
- Nightmare
- 포너블
- C언어
- bugbear
- Python
- OllyDbg
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |