Offset 풀이

2021. 7. 14. 10:09HackCTF

728x90

문제 정보
문제에서 주어진 파일
IDA로 디컴파일

원래 다른 오버플로우 문제들은 다 실행파일을 줬는데 이 문제는 공유 라이브러리 형식으로 된 문제를 주네요?

우선 분석부터 해보겠습니다.

 

v5에 main함수 인자 개수를 대입합니다.

그리고 문자열 하나를 출력 후 gest로 char형 배열 s를 입력받습니다.

그리고 select_func라는 함수에 s의 주소 값을 인자로 넣어 호출합니다.

 

select_func() 함수는 무슨 기능의 함수인지 IDA로 보겠습니다.

 

select_func() 함수를 IDA로 디컴파일

함수 포인터인 v3를 선언하고, two로 초기화 해줍니다.

그리고 dest에 우리가 입력한 문자열을 담은 s를 0x1F(10진수로 31)만큼 복사해줍니다.

dest가 "one"이면 v3를 one으로 바꿉니다.

그리고 v3() 함수를 호출해서 v3의 리턴 값을 리턴합니다.

 

이 함수가 끝인 줄 알고 IDA를 종료하려 했는데 굉장히 수상한 이름을 가진 함수를 발견했습니다.

 

print_flag() 함수를 IDA로 디컴파일

"flag.txt"라는 문장이 보이네요.

이 함수가 이번 문제의 핵심인 것 같습니다.

우선 다시 main() 함수로 돌아가서 문제를 어떻게 풀어야 할지 생각해보겠습니다.

 

사실 select_func() 함수는 그리 중요하지 않은 것 같습니다.

우선 puts에서 나오는 문자열은 recvuntil로 거르고

main() 함수에서 gets로 s를 입력받으니 이 부분에서 버퍼 오버플로우를 일으키면 될 것 같습니다.

그럼 여기서 중요한 것은 print_flag() 함수의 주소인데, 문제에서 주어진 offset 파일에 보호 기법이 걸려있었습니다.

 

checksec 명령어로 offset 파일의 보호기법 체크

여기서 눈여겨봐야 할 보호 기법은 PIE 보호 기법입니다.

 

PIE 보호 기법을 한 단어로 표현하면 랜덤입니다.

왜 랜덤이냐?

PIE 보호 기법은 파일을 실행할 때마다 bss, code 영역의 바이너리 주소를 랜덤화시킵니다.

이 말인즉슨, 문제에서 buf의 주소를 출력해주지 않는 이상 주소를 찾기가 더 까다로워진다는 뜻입니다.

 

그럼 이제 PIE 보호 기법을 고려하면서 다시 풀이 방법을 생각해보도록 하겠습니다.

 

아까는 gets에서 오버플로우를 일으키는 방식으로 풀이를 생각했지만, 지금부턴 select_func() 함수에 집중해보겠습니다.

select_func() 함수를 보면 strncpy 함수를 이용해서 dest에 src 값을 0x1F(10진수로 31)만큼 복사합니다.

 

여기서 dest의 크기는 10진수로 42, v3의 크기는 10진수로 12입니다.

두 변수 사이의 빈 공간은 30byte, 그런데 31byte만큼 strncpy가 이루어진다?

이 말은 1byte만큼을 우리가 변조할 수 있다는 말이 됩니다.

 

two() 함수와 print_flag() 함수의 시작 주소

IDA로 함수들의 시작 주소를 본 결과, 0부터 6까지는 모두 같고, 뒤에 있는 1byte만 다른 걸 볼 수 있습니다.

 

그러므로 맨 뒤 1byte를 \D8로 변조시킨다면?

FLAG를 얻을 수 있을 것입니다.

 

from pwn import *

p=remote("ctf.j0n9hyun.xyz",3007)

p.recvuntil("Which function would you like to call?")

b='a'*30
b+="\xD8"

p.sendline(b)

p.interactive()

FLAG 획득 완료
문제 풀이 성공

익스 코드 자체는 정말 너무나도 간단하지만....

이 익스 코드를 짜기 위한 아이디어를 도출하는 것이 익숙하지 않아서 애좀 먹었습니다.

연습을 더 해야겠네요.

728x90

'HackCTF' 카테고리의 다른 글

RTL_Core 풀이  (0) 2021.07.18
RTL_World 풀이  (0) 2021.07.17
Simple_Overflow_ver_2 풀이  (0) 2021.07.14
x64 Simple_size_BOF 풀이  (0) 2021.07.13
내 버퍼가 흘러넘친다!!! 풀이  (0) 2021.07.12