BugBug문제 풀다가 멘붕이 와서 다른 문제를 풀고 풀자고 마음을 먹고..
Serial을 풀어봤습니다!
생각보다 쉽게 풀었다.
파일은 64비트이고 ssp와nx가 걸려있다.
일단 파일을 실행을 해서 대충 무슨 프로그램인지 감을 잡아보자.
키를 받아야지 다음 단계로 넘어 갈 수 있는 것 같다.
ida로 열어보자.
main함수를 확인을 해보니
처음에 get_num함수로 값을 받은 후 product_key부분으로 넘어가는데 product_key부분을 보면
무슨 엄청난 연산을 한다...
전에 2017Codegate Angry Bird를 풀어봤는데 그것처럼 angr을 사용해서 풀면 될 것 같다.
(나도 처음에는 잘몰랐는데 angr을 사용해보니 값이 나왔다!)
이와 같이 짜준 후 돌리면 key값이 나온다.
615066814080
key값을 구했으니 다음단계로 넘어가보자
이와 같은 메뉴가 나온다.
1,Add
1번을 선택하면 insert가 나오면서 값을 줄 수 있다.
2.Remove
만들어진 목록을 보여주고 그중에서 선택을 해서 삭제를 할 수 있다.
3.Dump
정확하게는 모르겠지만 Add를 하고난 다음 3번을 실행 할 경우 주소값이 보여진다.(ex:0x123456)
4.Quit
프로그램을 빠져나간다.
4번을 제외한 1번2번3번에 취약점이 존재할 것 같다.
위에서 main 함수를 ida로 확인을 해봤으니
이번에는 1번2번3번 메뉴를 하나씩 ida로 확인을 해보자.
Add
*(_QWORD *)(32LL * count + a1 + 24) = num_list
이와 같이 구조체인 것을 확인을 할 수 있다.
위에 그림처럼 총32바이트 구조체이고
처음 24바이트는 get_num함수를 통해서 들어가고 마지막 8바이트는 num_list라는 것이 들어간다.
이번에는 Remove함수를 확인해 보자.
Remove
remove함수는 별거 없어 보인다..
그래도 나중에 쓰이니 있다고만 숙지해두자!
Dump
print로 a1+24의 주소값을 보여주고
(a1+24)를 실행을 해주고 a1을 인자로 받는다.
딱보아도 이곳이 취약한 것을 알 수 있다.
vulnerability
Dump부분에서 취약한 곳을 찾을 수 있었다.
Add부분도 확인을 해보면 취약점을 찾을 수 있다.
(※Add부분에서 insert를 get_num함수로 받는데 32바이트를 받는다.)
이 두개를 조합하면 쉘을 따낼 수 있다.
Exploit
이점들을 이용해서 Exploit을 해보겠다.
a1+24부분을 printf의 plt로 바꾸고 a1에 %p를 적어서 포맷스트링을 발생 시키는 것이다.
처음에는 got를 릭을 할려고 했는데 잘안되서 변경을 했다.
포맷스트링을 해서 값을 확인을 하면 Libc와 일정한 offset으로 떨어진 값이 나오는 것을 확인 할 수 있다.
이를 통해서 Libc주소를 Leak을 한 다음 system주소를 계산해서 구한 다음 쉘을 따면 될 것 같다.
Exploit코드가 너무길어서 캡쳐를 하기 힘들어서 두개로 분할해서 올렸습니다.
.
.
.
.
재밌는 문제였던 것 같다.
그럼 1일1pwn완료~!
'SYSTEM HACKING > 문제 풀이' 카테고리의 다른 글
HarekazeCTF 2018 - Harekaze Farm (Pwn) (0) | 2018.02.12 |
---|---|
HITCON 2017 - Start (0) | 2018.02.11 |
간단한 Crc CTF 문제 (0) | 2018.01.29 |
2016 Codegate -Watermelon (0) | 2018.01.24 |
2017 Codegate -babypwn (0) | 2018.01.12 |