Wargame/HackCTF

[HackCTF] x64 Simple_size_BOF 문제 풀이

핏디 2021. 7. 17. 03:26
SMALL

[문제]

 


[풀이]

 

 

프로그램을 실행시켜 보니 buf 의 주소가 매번 바뀌고 있었다.

이에 gdb를 실행시켰다.

 

info func 명령으로 함수 목록을 보니 특별하게 주어진 함수는 존재하지 않았다.

 

main 함수를 확인하였고, 분석한 코드는 다음과 같다.

더보기

main+18~36: setvbuf 함수 호출

main+41~46: "삐빅- 자살방지 문제입니다." 출력

main+51~71: buf 주소 출력

(rbp-0x6d30의 주소를 가져옴)

 main+76~91: 사용자 입력값 rbp-0x6d30에 저장

 

main(){

setvbuf(0, 2, 0);

puts(); ->"삐빅- 자살방지 문제입니다." 

printf("buf: %p\n", rbp-0x6d30);

gets(); ->rbp-0x6d30에 저장

 

 

이에 get 함수 부분에 bp를 걸어 다수의 a를 입력하였다.

rbp-0x6d30 메모리를 확인하니 입력값이 저장되는 것을 확인할 수 있다.

 

이후 ret을 위해

0x7fffffffdf48 --> 0x7ffff7a03bf7 (<__libc_start_main+231>: mov    edi,eax)

을 호출하고 있다.

 

이에 다음과 같은 exploit 을 생각해볼 수 있다.

입력값에 shellcode 삽입 + dummy (ret 주소 전까지) + ret 자리에 buf 주소 삽입

입력 값이 buf의 주소 자리에 들어가기 때문에 ret 자리에 buf 주소를 넣어주면 된다.

 

그런데, 프로그램을 실행했을 때 buf의 주소는 매번 달라졌다.

따라서 특정한 주소를 pwntool로 넘겨주기는 어렵고, 서버에 접속했을 때 받는 값을 이용해야 한다.

 

exploit 코드를 짜보면 다음과 같다.

출력되는 buf 주소를 14바이트 만큼 받아 16진수 형태로 형변환을 진행한다.

31바이트의 쉘코드를 이용했으며, ret주소와 rbp-0x6d30의 차이를 계산하면 0x6d30(27960) 임을 알 수 있다.

이에 쉘코드만큼을 제외한 27929 바이트를 dummy로 채우고 buf 주소를 채운다.

 

-> ret에서 buf 주소로 이동하게 되니 buf에 저장된 shellcode가 실행될 것이다.

 

 

LIST

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

[HackCTF] Offset  (0) 2021.07.25
[HackCTF] Simple_Overflow_ver_2  (0) 2021.07.25
[HackCTF] x64 Buffer Overflow 문제 풀이  (0) 2021.07.17
[HackCTF] 내 버퍼가 흘러넘친다!  (0) 2021.07.17
[HackCTF] Basic_FSB 문제풀이  (0) 2021.07.14