감자 텃밭

offset 본문

my_study/HackCTF

offset

g2h 2021. 5. 26. 00:35

HackCTF Offset

이번에 풀어볼 문제는 offset문제이다. 해당문제는 대부분 IDA라는 프로그램으로 쉽게 풀 수 있지만 한번 안쓰고 풀어보기로 하였다.

 

일단 해당 프로그램이 어떤 메모리보호기법이 적용되어있는지부터 확인하였다.

음.. 일단 NX가 활성화 되어있다 NX는 스택또는 힙등에서 쉘코드를 사용할 수 없도록 하는 보호 기법이다.

그렇다면 쉘코드를 직접적으로 삽입할 수 없는 거 같다.

 

일단 프로그램을 동작시켜보자

프로그램을 동작시킬 함수를 물어보고? 입력을받도록 되어있다.

일단 gdb로 까보자..

 

main함수

음... select_func함수가 있고 32의 공간을 확보하고 함수 인자값으로 하나를 입력받는 거 같다. 해당 select_func를 확인해보자.

select_func 함수

strncpy함수를 이용해서 31바이트 만큼 ebp-0x2a에 값을 받고 eax에 저장하며,

strnmp함수를 사용하여 입력받은값과 무언가를 비교한다

또한 같지 않을 경우 select_func함수를 이용하여 특정 함수를 호출하는 거 같다 특정함수는

ebp-0xc에 저장되며 85번째 줄에 call eax를 통해 호출 되는듯 하다 여기서 쉘코드가 실행이안되기에

이 프로그램에 시스템함수또는 쉘을 획득하는 함수가 있다면 call부분에 우리가 원하는 함수의 주소를 넣으면 될것 같다.

 

그래서 함수목록을 확인하였더니 수상한 함수가 발견되었다.

 

이 함수는 함수명만봐도 플래그를 출력해줄 거 같다. 

그렇다면 select_func 함수에서 인자값으로 넘어오는 값을 저장하는 부분인 ebp-0x2a에서 버퍼오버플로우를 일으켜

함수가 호출되는 ebp-0xc의 주소값에 print_flag함수의 주소를 넣는다면 print_flag함수가 호출되면서 플래그를 보여줄 거 같다. 일단 각각의 주소값을 구해보자.

30byte 만큼의 거리차이가 있다. 그럼 우리는 call에 우리가 원하는 주소값을 넣기 위해서 1byte만큼 버퍼오버플로우를 일으킬 수 있다...!

이제 함수의 주소값을 보자

오호 call에 호출되는 값과 1바이트가 차이가 난다 그렇다면

우리가 짜야할 익스코드에서 페이로드는

dummy(30)+\xd8 이다!

(call함수에서 호출되는 0xc의 주소값이 0x56555600 이고 print_flag의 주소값이 0x565556d8이기 때문에 1byte가 차이)

그럼 이제 모든 준비는 끝났으니 익스코드를 짜러가보자!!!

공격 코드

해당 코드는 이렇게 짰다 더미값을 30바이트를 주고 오버플로우를위한1바이트를 주소값에맞게 대입 후

recvunril을 사용하여 ?문자가 나올때까지 문자를 받고

그 후 해당 페이로드를 전송시키도록 하였다

성공

성공적으로 플래그를 획득하였다!!!

 

EX) 해당 문제는 IDA라는 프로그램을 쓰면 쉽게 풀 수 있지만 지금 내실력으로 그런방법으로 풀어버리면 실력이 늘지 않을 거 같아 쓰지않고 풀어봤다.. 너무어렵다.. 살짝 코드를 힐끗 보기는 했지만..그래도 직접 풀때는 보지않고 이해하며 어셈블리어코드를 보며 이해하며 풀어보았다.. IDA를 쓰는게 맞는건가

'my_study > HackCTF' 카테고리의 다른 글

rtl_core  (0) 2021.07.21
rtl_world  (1) 2021.05.28
Simple_overflow_bof_ver_2  (0) 2021.05.21
Simple_size_bof  (0) 2021.05.21
64bof_basic  (0) 2021.05.21