일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- pwnable
- Operating System
- 워게임
- Shell code
- 운영체제
- 네트워크
- Buffer Overflow
- Spring MVC
- 해킹
- 정보처리기사 실기
- OS
- Lord of BOF
- SQL
- Spring
- LOB
- hacking
- stack overflow
- wargame
- 정보보안기사 실기
- Pwnable.kr
- webhacking
- System
- system hacking
- 정보보안기사
- 웹해킹
- BOF
- webhacking.kr
- Payload
- Spring Framework
- PWN
- Today
- Total
DongDD's IT
[pwnable.kr] bof 본문
[pwnable.kr] bof
Problem
buffer overflow가 가장 일반적인 소프트웨어 취약점이라고 들었는데 이것이 사실이냐 묻고있다.
buffer overflow에 대한 문제일 것 같았다.
이번 문제에서는 ssh로 접속할 수 있는 서버가 주어지지 않았고 nc로 프로그램에 연결할 수 있게 되어있었고 소스 코드 파일과 bof 실행 파일을 다운 받을 수 있게 되어있었다.
먼저 소스 코드를 확인해보았다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> #include <string.h> #include <stdlib.h> void func(int key){ char overflowme[32]; printf("overflow me : "); gets(overflowme); // smash me! if(key == 0xcafebabe){ system("/bin/sh"); } else{ printf("Nah..\n"); } } int main(int argc, char* argv[]){ func(0xdeadbeef); return 0; } | cs |
main에서는 func함수를 호출하고 인자로 0xdeadbeef를 넘겨준다.
func함수에서는 overflowme라는 buffer 32 bytes가 선언되어있고 gets를 통해 stdin으로 입력을 받는다.
이 후에 함수 인자로 받은 key가 0xcafebabe인지 확인해 일치한다면 shell을 얻을 수 있게 되어있는 코드였다.
Solution
이번 문제는 간단한 overflow이지만 gdb를 통해 확인해보니 stack dummy가 적용되어 있는 것 같았다.
gdb를 통해 main을 확인해보았다. overflowme buffer가 [ebp-0x2c]라고 표현된 것으로 보아 실제로는 buffer가 32 bytes로 선언되어있지만 0x2c(44 bytes)로 12 bytes의 dummy가 추가적으로 붙은 것으로 볼 수 있다.
실제 값을 넣어 메모리 값을 확인해보았다.
buffer의 시작인 0xffffd5fc부터 0xdeadbeef가 들어있는 key까지의 거리가 (0xffffd630 - 0xffffd5fc)인 52 bytes인 것을 확인할 수 있었다.
즉, func함수의 스택은 위와 같이 되어있다. buffer(32bytes) 위에 stack dummy(12 bytes)가 쌓이고 그 후에 sfp, return address, argv(key)가 쌓여있다.
처음에는 return address를 프로그램 내에 있는 system함수의 시작점으로 해서 payload를 작성했으나 stack smashing detecting이 뜨는 것으로 보아 이 방법은 안되는 것이라고 생각되었다.
그래서 overflow를 일으켜 return address까지 dummy값으로 덮고 key값에 0xcafebabe를 넣어주는 방식으로 시도해보았다.
Payload = dummy(52 bytes, "A"*52) + key(4 bytes, 0xcafebabe)
위의 payload를 stdin으로 넣어주고 nc를 통해 프로그램을 실행시키니 shell을 얻을 수 있었다.
ls를 통해 파일들을 확인해보니 flag라는 파일이 있었고 이 파일을 확인해보니 flag가 적혀있었다.
************** Answer & Flag **************
Flag : daddy, I just pwned a buFFer :)
'Wargame > pwnable.kr' 카테고리의 다른 글
[pwnable.kr]passcode (0) | 2018.03.28 |
---|---|
[pwnable.kr] flag (0) | 2018.03.09 |
[pwnable.kr] collision (0) | 2018.03.02 |
[pwnable.kr] fd (0) | 2018.03.01 |
[pwnable.kr] lotto 문제 풀이 (0) | 2017.08.27 |