[문제]
[풀이]
프로그램을 실행시켜 보니 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가 실행될 것이다.
'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 |