저번 게시물에 이어 시스템 해킹 기초 문제를 좀 더 풀어보겠습니다.
이번에는 HackCTF사이트의 문제를 가져왔습니다.
값 변조 | Basic_BOF #1 |
실행 주소 값 변조 | Basic_BOF #2 |
return 주소 값 변조 | offset |
문자열 변환으로 return 주소 값 변조 | g++ pwn |
1. Basic_BOF #1
버퍼 오버 플로우 문제로 주어진 파일을 IDA로 열어 확인하였을 때 특정 변수가 -55903873일 때, 즉, DEADBEEF라는 16진수 값을 가질 때 shell을 획득하도록 되어있었습니다.
그렇기에 payload에 deadbeef를 패키징하여 16진수 형태를 표현하고 앞의 dummy값은 s크기인 40byte를 설정하여 check값을 변조하면 됩니다.
2. Basic_BOF #2
포인터로 주소 값을 불러오는 것을 이용하여 특정 부분의 실행을 임의로 시키는 형태입니다.
입력받는 곳은 sup함수를 호출하고, fgets를 통해 s를 입력받는 형식입니다. IDA로 확인 시 shell함수도 존재하여 확인하였는데 system함수이기에 명령을 수행할 수 있을 것입니다.
이 함수의 시작 주소 값인 ebp레지스터 값을 다른 곳에 저장하여 payload로 전송하여야 하기에 임시로 저장해놓습니다. 그 후 s변수의 크기인 128byte만큼 dummy값을 채워 v5를 호출할 때 shell함수를 반환하도록 만들 수 있습니다.
3. offset
이번 문제는 바이너리 보호 기법이 걸려있어 쉘 코드 사용이 불가능합니다.
분석을 위해 IDA로 확인 시 입력을 받아 select_func함수의 인자로 사용되는 것을 볼 수 있으며, 입력한 문자열이 one, two와 같이 입력받아 리턴되는 형식입니다.
여기서 함수의 이름을 보면 입력 값과 같은 것을 볼 수 있으며 print_flag함수도 쉽게 확인할 수 있습니다.
dummy값은 select_func함수의 dest변수로 값이 저장되기에 dest크기만큼 넣은 후, flag함수의 시작 주소를 오버플로우 하게 넣으면 return eax레지스터가 변조되게 됩니다. 그렇기에 2번 문제와 비슷하게 반환 값에 print_flag의 ebp값을 넣어주면 flag가 출력될 것입니다.
4. g++ pwn
입력받고 출력하는 형태의 프로그램으로 vuln함수를 통해 이루어지는 것을 확인할 수 있습니다.
vuln함수를 살펴보면 32byte 크기까지 입력받아 출력하는 형태로 보이고 v0까지 0x3C의 크기를 가지고 있는 것으로 보아 60byte만큼의 크기와 sfp 4byte를 s변수부터 오버 플로우 하여야 return 시 get_flag함수를 실행시킬 수 있을 것입니다.
문제 해결을 위해 코드를 자세히 보면 'I'를 'you'로 변환하는 함수가 있기에 I를 20byte 지정하고 dummy값을 4byte 지정하면 payload를 넣을 수 있을 크기가 될 것입니다.
정의된 get_flag함수 시작 주소를 담고 있는 ebp레지스터를 보면 get_flag함수의 주소를 알 수 있어 payload값에 넣어 get_flag함수를 불러오도록 만들 수 있습니다.
'TeamH4C_ProjectH4C > 워게임' 카테고리의 다른 글
[TeamH4C_PWNABLE] 시스템 해킹_연습문제6 (2) | 2021.04.11 |
---|---|
[TeamH4C_PWNABLE] 시스템 해킹_연습문제1-4 (0) | 2021.04.04 |
[TeamH4C_FTZ] Level1 ~ Level5 (0) | 2021.03.28 |
[TeamH4C_dreamhack] 시스템 해킹_기초문제 (0) | 2021.03.21 |
[TeamH4C_FTZ] Trainer1 ~ Trainer10 (0) | 2021.03.14 |