본문 바로가기

Pwnable.kr

Pwnable.kr [simple login]

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의 값이 되는 상황.

 

auth 함수 취약한 부분

현재 입력값이 input 변수에 저장되게 되고, input 변수의 주소는 0x0811eb40으로 bss영역이다. 

input 변수 주소

그럼 ebp값을 input 주소로 바꾸면, ebp+4는 ret 주소니까

 

main이 ret될 때 input + 4에다가 correct 주소를 주어 해당 함수로 뛰게 하면 된다. 

correct 함수

여기서 답은 여러개가 될 수 있는데, correct 함수 프롤로그 부분으로 점프할 경우

input의 값은 0xdeadbeef(4byte) + correct 함수 시작 주소(4byte) + input 시작 주소(4byte)가 되어야 한다. 

(if문 조건 때문에)

 

반면에 if문 안에 puts나 system 호출 부분등 적당한 부분으로 바로 뛴다면 그냥

dummy (4byte) + correct 함수 적당한 중간 주소(4byte) + input 시작 주소(4byte)로 하면 된다.

 

main 함수에서 v5(입력값)를 decoding 함

입력 형태를 확인해보면 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