감자 텃밭

[pwnkr] - passcode 본문

my_study/pwn.kr

[pwnkr] - passcode

g2h 2021. 9. 1. 01:20

해당 문제와 함께 제공되는 소스코드는 아래와 같다.

welcome함수에서 이름을 입력받고 login함수에서 두 개의 패스코드를 입력받아 해당 조건문을 통과하면 플래그를 획득할 수 있다. 하지만 해당 두 정수를 입력하면 플래그가 출력되지 않는다 그 이유는 scanf의 함수 원형을 살펴보면

서식 문자 뒤에 변수를 입력할 때는 &함께 주소를 지정해줘야 한다 하지만 위의 코드대로 입력할세 passcode변수에는 쓰레기 값들이 들어가게 된다. 아래의 welcome함수에서는 문자 또는 문자열일 경우에는 해당 첫 번째 인덱스가 시작 주소를 가리키기 때문에 상관이 없다.

일단 해당문제를 분석하기 위해 gdb를 통해 두 함수를 살펴봤다.

welcome함수에서는 해당 name변수에 입력을 받는 위치는 ebp-0x70 위치에 입력받는다.

login함수를 살펴보면 0x10 위치에 passcode1가 입력받는다 이를 해석해보면 0x70 - 0x10 = 0x60

0x60은 10진수로 변환 할 경우 96이 나온다 즉 name함수를 100바이트만큼 입력받지만 입력을 받는 메모리 주소부분이 passcde1과 4바이트가 겹친다는 것이다. 그렇다면 96바이트만큼 더미 값을 채운 후 4바이트 부분 즉 passcde1의 부분을 passcde1 입력받는 후에 나오는 fflush함수의 got주소로 변환시켜 got overwirte 시키면 된다 그 후 첫 번째 입력값 받는 부분은 즉 fflush_got 부분에 우리가 입력하는 값이 들어간다 이 부분에 쉘을획득할 수 있도록 system함수를 넣어주면 된다

fflush의 got주소를 찾고

system함수의 윗 주소를 사용한다 그 이유는 즉 system("/bin/sh")를 실행시켜야 하기 때문이다 함수의 위에는 인자 값이 오기때문에 해당 인자값이 /bin/sh문자열일 것이다.

그 후 아래와 같이 페이로드를 작성하면 쉘을 획득할 수 있다.

여기서 입력값이 위와 같은 이유는 scanf로 입력받기 때문에 정수형으로 입력을 줘 여하기 때문이다.

 

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

[pwnkr] - input문제  (0) 2021.09.01
[pwnkr] - random  (0) 2021.09.01
[pwnkr] - flag  (0) 2021.09.01
[pwnkr] - bof 문제  (0) 2021.09.01
[pwnkr] - collision문제  (0) 2021.09.01