일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- System
- 정보처리기사 실기
- webhacking
- Spring Framework
- 운영체제
- webhacking.kr
- Spring
- BOF
- OS
- Spring MVC
- 정보보안기사 실기
- Payload
- SQL
- PWN
- Buffer Overflow
- 네트워크
- stack overflow
- 해킹
- Operating System
- 워게임
- LOB
- hacking
- Lord of BOF
- wargame
- system hacking
- Shell code
- 정보보안기사
- 웹해킹
- Pwnable.kr
- Today
- Total
DongDD's IT
[LOB] Level15 giant 본문
[LOB] Level15 giant
Problem
이번 문제도 assassin 실행 파일과 assassin.c 소스 코드 파일이 있었다.
먼저 소스 코드를 확인해보았다.
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 | #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { char buffer[40]; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] == '\xbf') { printf("stack retbayed you!\n"); exit(0); } if(argv[1][47] == '\x40') { printf("library retbayed you, too!!\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); // buffer+sfp hunter memset(buffer, 0, 44); } | cs |
소스 코드 맨 위의 힌트에는 "no stack, no RTL"라는 메시지가 적혀있었다.
buffer는 40 bytes이고 argv를 입력받아야 한다.
이번에는 argv[1]의 48번째 글자가 "/xbf"가 아니어야 한다. 즉, stack 영역의 변수를 사용하면 안된다는 의미같다.
그리고 추가된 부분이 argv[1]의 48번째 글자가 "/x40"도 아니어야 한다는 것이다. 즉, libc에 있는 0x40으로 시작하는 주소인 library들의 함수들을 사용하지 못하게 한다.
그 후에 strcpy를 통해 argv[1]을 buffer에 복사하고 마지막에 buffer와 sfp를 초기화시켜준다.
Solution
처음에는 hint에 써있는 "no stack, no RTL"을 보고 stack도 사용못하고 RTL도 사용못하면 0x8048000의 주소에서 무엇을 찾아서 해결해야 할 것 같다는 생각이 들어 gdb를 통해 모든 값들을 봤지만 마땅히 사용할 수 있을 것 같은 값이 없었다.
풀 방법이 생각나지 않다가 문득 RTL이 다시 떠올랐다. RTL을 사용해 해결할 수 있었고 hint를 안보는 게 더 나을 수도 있다는 생각이 들었다.
1. Return to Library(RTL)
RTL로 간단히 해결할 수 있는 문제였지만 hint 때문에 시간이 좀 걸렸던 것 같다.
먼저 ldd를 통해 assassin 파일을 확인해보니 ASLR은 걸려있지 않았고 단순히 return address가 "\x40"인지만 확인한다는 것을 알 수 있었다.
먼저 gdb를 통해 main에 break point를 잡고 system()함수의 주소와 프로그램을 작성해 "/bin/sh"의 주소를 알아내었다.
system() 함수의 주소 : 0x40058ae0
"/bin/sh"의 주소 : 0x400fbff9
그 다음에는 전 문제에서 했던 방식으로 시도해보려고 했다.
Payload = dummy(44 bytes, "A"*44) + return address1(4 bytes, ??) + return address2(4 bytes, system()함수 주소, 0x40058ae0) + dummy(4 bytes) + argument1(4 bytes, "/bin/sh"의 주소, 0x400fbff9)
return address에 처음에 무엇을 넣어야 할지 몰라서 printf()와 exit() 함수 등 프로그램 내에서 쓰였었던 함수들을 넣어보았지만 printf()함수를 넣었을 때는 segmentation fault가 떴고 exit()함수를 넣었을 때는 그냥 프로그램이 종료되었다.
그 후에도 leave가 위치한 0x804851d를 넣어보았지만 실패했다.
그런데 gdb를 계속 보다가 0x804851f에 nop이 있는 것을 볼 수 있었고 이 값을 한번 넣어보았더니 문제에 통과할 수 있었다.
이 문제를 해결된 이유가 return address에 위치한 것이 NOP이라 그냥 넘어가서 system() 함수가 실행되는 건지 아니면 전 문제에서 썼던 방식대로 return address가 종료되고 두 번째의 return address인 system()함수가 실행되는 건지는 정확히는 모르겠다.
그런데 printf()나 exit()를 넣었을 때 실행되지 않았던 것을 보면 전자인 것 같은데 왜 printf()와 exit()함수로 했을 때는 실행되지 않는 지는 의문이다.
추후에 RTL에서 다시 공부하면서 어느 정도 파악했는데 아마 plt값이라 아마 실행되지 않는 것 같았다.
그러나 got를 쓰기에는 "\x40"으로 시작하는 주소를 갖기 때문에 사용할 수 없는 것 같다.
************** Answer & Flag **************
1. Return to Library(RTL)
Payload = dummy(44 bytes, "A"*44) + return address1(4 bytes, NOP이 위치한 주소, 0x0804851f) + return address2(4 bytes, system()함수 주소, 0x40058ae0) + dummy(4 bytes) + argument1(4 bytes, "/bin/sh"의 주소, 0x400fbff9)
argv[1] = "A"*44 + "\x1f\x85\x04\x08" + "\xe0\x8a\x05\x40" + "A"*4 + "\xf9\xbf\x0f\x40"
Next ID : assassin
Next PW : pushing me away
'Wargame > LOB' 카테고리의 다른 글
[LOB] Level17 zombie_assassin (0) | 2018.01.31 |
---|---|
[LOB] Level16 assassin (0) | 2018.01.31 |
[LOB] Level14 bugbear (0) | 2018.01.27 |
[LOB] Level13 darkknight (0) | 2018.01.26 |
[LOB] level12 golem (0) | 2018.01.25 |