일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- command
- vi 외부 명령어
- 오버워치 세이버메트릭스
- vim
- libtins
- #IntelManual
- FTZ 레벨2
- KASAN
- libpcap
- #IntelManual #segment Descriptor #세그먼트 디스크립터 #MINT64 #Sqix
- Network
- Find
- C++11
- linux
- vi
- Overwatch League SaberMetrics
- BEST of the BEST
- #Best of the Best #OS #MINT64 #Sqix
- #MINT64 #Sqix
- #Qt Creator
- >
- ftz
- Sqix
- 인터럽트
- #
- 오버워치
- Today
- Total
Sqix
Pwnable.kr - Toddler's Bottle : Buffer Overflow 본문
이번에는 Pwnable.kr의 bof 문제를 풀어보도록 하겠습니다. http://pwnable.kr/bin/bof , http://pwnable.kr/bin/bof.c 를 다운로드 받아서 문제 풀이에 이용할 수 있도록 해 주었습니다. 저는 wget으로 다운로드를 받아서 문제를 풀어보도록 하겠습니다. ex.py는 문제 풀이를 위한 exploit 코드를 파이썬으로 작성한 것인데, 굳이 ex를 짤 필요는 없기 때문에 이번 풀이 과정에서는 생략하도록 하겠습니다.
먼저 코드를 보도록 하겠습니다. main에서는 0xdeadbeef 라는 인자를 func에 넣어 주고, func에서는 해당 값을 인자로 받아와 key로 사용을 합니다. gets 함수는 32바이트의 버퍼인 overflowme 배열에 유저 입력을 받을 수 있도록 하였습니다. 만약 여기서 key가 0xcafebabe라면 shell을 띄우고, 그렇지 않다면 Nah..를 출력하고 프로그램이 종료됩니다.
기본적으로 key에 0xdeadbeef가 인자로 들어가기 때문에, gets 함수를 이용해서 오버플로우를 시키고, 이를 통해 key의 값을 강제로 바꾸어 주어야 할 것 같습니다.
그렇다면 당연히 어셈을 보는게 맞겠죠. gdb -q bof 명령어를 통해 gdb를 켜고, disas func 명령어를 이용하여 func 함수 부분을 disassemble하여 볼 수 있도록 합니다. 어셈을 쭉 읽어나가면서, 몇 바이트를 오버플로우 시켜야 하는지를 알아 보도록 하겠습니다.
우선, gets를 통해 받아오는 부분을 찾아서 해당 부분의 시작 주소가 어디인지 찾고, key값이 저장된 부분의 주소를 알아내어 해당 지점 간에 몇 바이트 차이가 있는지 거리 계산을 하여 그 부분을 덮어버리고, 덮인 다음 부분에 0xcafebabe를 리틀 엔디언으로 넣어 주어야 할 것입니다.
<+35>의 call이 바로 get 함수의 호출입니다. 그렇다면 분명 버퍼를 타겟하여 해당 지점에 저장을 하게 될 텐데요, 위로 올라가 보면, 그 곳이 ebp - 0x2c 지점이라는 것을 알 수 있습니다. ebp - 0x2c의 주소를 복사해서 eax에 넣고, 다시 그 지점을 dword ptr [esp]에 복사하여 해당 버퍼를 get의 파라미터로 삼았기 때문이죠. 그 후에 key와 cafebabe를 비교하는 if문이 등장하는데, 여기서 ebp+0x8의 주소와 비교를 하는 것으로 보아 key는 ebp + 0x8지점에 저장되어있다는 것을 알 수 있습니다.
즉, 두 지점 간의 거리는 0x8 - (-0x2c) = 0x34 == 52입니다. 따라서 52바이트를 A로 채우고, 다음을 0xbe 0xba 0xfe 0xca 순으로 바이트 오더링을 바꾸어서 채워 주면 key에 0xcafebabe가 들어가게 됩니다.
이러한 스크립트를 작성하여 넘겨 주면 됩니다.
'Wargame > Pwnable.kr' 카테고리의 다른 글
Pwnable.kr - Toddler's Bottle : Flag (0) | 2017.09.06 |
---|---|
Pwnable.kr - Toddler's Bottle : Hash Collision (0) | 2017.09.04 |
Pwnable.kr - Toddler's Bottle : File Descriptor (0) | 2017.09.01 |