짱짱해커가 되고 싶은 나

[passcode] Writeup 본문

pwnable/pwnable.kr

[passcode] Writeup

동로시 2020. 5. 21. 16:19

passcode.c

welcome() 을 통해 name[100]에 100글자 이내로 scanf한다.

login()을 통해 scanf("%d", passcode1)를 하고 입력 버퍼를 fflush를 이용해 비운 뒤 scanf("%d", passcode2)를 한다.

&passcode1인 passcode1을 하는 것을 확인 할 수있다.

즉, passcode1 변수의 위치 안에 저장하지 못하고 변수의 위치 자체를 바꾸는 것이다.

그렇다면 passcode1에 @got에 system("\bin\cat flag")의 위치를 넣으면 되지 않을까?

 

gdb를 해보자

welcome()

welcome()함수를 보면 name 배열의 위치가 ebp-0x70인 것을 확인할 수 있다.

 

login()

login()함수를 보면 passcode1의 위치는 ebp-0x10, passcode2의 위치는 ebp-0xc임을 확인 할 수 있다.

 

name과 passcode1의 위치 차이가 0x60(96)이다. name이 100보다 거리가 짧으므로 passcode1의 4bytes를 덮어 씌울 수 있다. 그렇다면 이 4bytes에 @got를 넣으면 될 것 같다.

비교하기 전에 호출되는 함수@plt를 중 하나를 선택하자.

 

printf@plt

printf@got의 위치는 0x804a000이다.

name에 "A"*96 + "\x00\xa0\x04\x08"를 넣으면 된다.

그리고 이 passcode1의 주소를 system함수로 바꾸면 되기 때문에 0x80485e3을 입력해주면 된다.

그런데 int형으로 입력받기 때문에 134514147을 넣어주면 된다.

 

 

'pwnable > pwnable.kr' 카테고리의 다른 글

[random] Writeup  (0) 2020.05.21
[flag] Writeup  (0) 2020.05.21
[bof] Writeup  (0) 2020.05.20
[Collision] Writeup  (0) 2020.05.20
[fd] writeup  (0) 2020.01.01
Comments