http://pwnable.kr/bin/login에서 파일 다운로드 가능
ELF 32bit 파일이고, canary랑 NX가 있는 것으로 나옴
근데 문제 풀다보면 canary 못 찾겠음
애초에 풀이방식도 auth 함수에서 memcpy를 이용해 ebp of main을 감염시키고
fake ebp로 correct 함수로 점프 뛰면서 기존 루틴 다 무시하고 그냥 쉘 따버리는 건데
checksec으로 확인한 건데 왜 있다고 나오는지 잘 모르겠음
어쨌든 실행해보면 입력값을 똑같이 해도 계속 hash값이 다르게 출력됨
뭔가 해쉬값 계산하는 루틴을 보면 초기화되지 않은 값들을 사용하는 부분들이 있고,
gdb에서 재실행을 하는 경우에는 해쉬값이 똑같이 되는 것을 보았을 때
메모리 쓰레기 값을 통해서 계산이 이루어지는 것으로 보인다.
그럼 아까 말했듯이 ebp를 덮어쓰게 되는데, auth 함수에서
memcpy를 12byte 만큼 하지만 복사 시작 주소가 ebp - 8이라서 4byte만큼
overflow가 일어난다.
마지막 4byte가 ebp of main의 값이 되는 상황.
현재 입력값이 input 변수에 저장되게 되고, input 변수의 주소는 0x0811eb40으로 bss영역이다.
그럼 ebp값을 input 주소로 바꾸면, ebp+4는 ret 주소니까
main이 ret될 때 input + 4에다가 correct 주소를 주어 해당 함수로 뛰게 하면 된다.
여기서 답은 여러개가 될 수 있는데, correct 함수 프롤로그 부분으로 점프할 경우
input의 값은 0xdeadbeef(4byte) + correct 함수 시작 주소(4byte) + input 시작 주소(4byte)가 되어야 한다.
(if문 조건 때문에)
반면에 if문 안에 puts나 system 호출 부분등 적당한 부분으로 바로 뛴다면 그냥
dummy (4byte) + correct 함수 적당한 중간 주소(4byte) + input 시작 주소(4byte)로 하면 된다.
입력 형태를 확인해보면 Base64Decoding을 한번 하므로, encoding된 형태로 입력해주면 된다.
776t3l+SBAhA6xEI (DEADBEEF 조건 통과 O)
QUFBQXiSBAhA6xEI (더미 AAAA, 중간으로 점프, Conglatuation~ 출력)
QkJCQoSSBAhA6xEI (더미 BBBB, 중간으로 점프, 바로 쉘 실행)
등등 여러가지 값이 나올 수 있당.
지적 환영, 배우는 중
'Pwnable.kr' 카테고리의 다른 글
Pwnable.kr [dragon] (0) | 2019.10.16 |
---|---|
Pwnable.kr [echo2] (0) | 2019.10.10 |
Pwnable.kr[loveletter] (0) | 2019.09.22 |
Pwnable.kr[fix] (0) | 2019.09.15 |
Pwnable.kr[tiny_easy] (0) | 2019.09.15 |