이 문제는 brute-force로 canary 값을 알아낸 후 리턴주소를 win으로 exploit하면 된다.
코드를 보면
첫번째 read할 때 exploit코드의 길이만큼 입력하고
두번째 read할 때 exploit을 하는 것
여기서 첫번째 포인트는 canary위치가 어디인가
또 canary를 어떻게 때려맞출 것인가
canary위치는 vuln함수의 memcpy를 보면
ebp-0x10에 있는 걸 알 수 있다.
그럼 buf의 위치만 알면 코드에서 때려맞출 canary의 위치를 알 수 있다.
buf는 read(0,buf,count)를 보면
ebp-0x30에 있는 걸 알 수 있다.
0x20 즉, 32byte 만큼 떨어져 있다.
두번째로 brute-force로 때려맞춰야 하는데 어떻게?
여기서 놓쳤던 부분은
canary는 이미 메모리 내에 있는 값이고 그래서 굳이 4자리를 한번에 때려맞추지 않아도
한개씩 맞춰서 알아내도 된다는 것
즉,
memcpy 이후 canary엔 값이 있다.
global_canary 주소 : 0x804a058
이 상태에서 length를 전체 덮어쓰는 길이인 36byte가 아닌
33byte부터 입력해서 하나씩 맞추는 것
canary값이 맞으면 Ok문장('***'문장X)이 실행되는 것을 이용한다.
이렇게 짜서 canary를 구하면 IHwj값이 나온다.
그 canary값과 리턴주소(ebp+0x4)를 win함수 주소(0x80486eb)로 덮어쓰면
끝
기억하자
1. ssh는 원격자의 컴퓨터로 접속하는 것
2. set_working_directory() : 디렉토리 이동
3. '{}'.format() : {}있는 부분에 값이 문자열로 들어간다.
4. 찾는문자열 not in 문자열 : 문자열 내에 내가 찾고자하는 문자열이 있는지 확인한다.
5. log : from pwn import * 사용하면 log 객체가 전역 이름 공간에 삽입된다.
이걸 이용해 exploitation과정에서 상태 메시지 출력가능
'CTF > picoCTF' 카테고리의 다른 글
echo back (0) | 2019.01.11 |
---|---|
rop chain (0) | 2019.01.11 |
authenticate (0) | 2018.12.28 |
keygen-me1 (0) | 2018.11.18 |
assembly4 (0) | 2018.11.18 |