일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- blind sql injection
- window
- IF문
- python
- jQuery
- htmlspecialchars
- 사칙연산
- object
- 조건문
- 김성엽 대표님
- 파이썬
- 백준 파이썬
- xss game
- 백준 알고리즘
- 객체
- Pwndbg
- github
- suninatas 풀이
- 메소드
- 포인터
- lord of sql injection
- xss game 풀이
- element 조회
- burp suite
- document
- 함수
- sql injection
- 자바스크립트
- 배열
- property
- Today
- Total
power-girl0-0
[pwnable] collision 풀이 본문
안녕하세요~~ (∩^o^)⊃━☆
0. 풀기 전, 공부하고 오기!
C언어 "포인터 배열"을 잘 이해하고 있다면, 쉽게 문제를 풀 수 있을 것이다.
1. 문제
문제에서 주어진 C언어 코드이다.
#include <stdio.h>
#include <string.h>
unsigned long hashcode = 0x21DD09EC;
unsigned long check_password(const char* p){
int* ip = (int*)p;
int i;
int res=0;
for(i=0; i<5; i++){
res += ip[i];
}
return res;
}
int main(int argc, char* argv[]){
if(argc<2){
printf("usage : %s [passcode]\n", argv[0]);
return 0;
}
if(strlen(argv[1]) != 20){
printf("passcode length should be 20 bytes\n");
return 0;
}
if(hashcode == check_password( argv[1] )){
system("/bin/cat flag");
return 0;
}
else
printf("wrong passcode.\n");
return 0;
}
2. Code 분석
위 code를 분석해 보면, 아래와 같은 조건이 존재하는 것을 알 수 있다.
1. 입력받는 인자값이 20byte이어야한다. 2. check_password함수에서 인자값 20byte를 4byte씩 나눈 후, 그 값들을 더한 값이 return된다. 3. check_password함수의 return값이 hashcode변수에 존재하는 0x21DD09EC값과 일치해야 한다. |
check_password의 인자로 argv[1]이 들어가있는 것을 볼 수 있다.
이는 인자로 입력받은 20byte가 저장되어있는 배열의 첫글자 주소값을 의미한다. ( 빈약하지만, 아래 그림 참고.. )
여기서, 중요하게 봐야할 코드는 char * 자료형이 int *자료형으로 형변환되는 것이다.
이는 아래 그림과 같이, p는 4byte값을 가르키게 되는 것이다.
이후, ip의 인덱스 0 ~ 4까지 순서대로 더해진다.
여기서 더해진 값이 0x21DD09EC일 경우, flag를 획득할 수 있는 것이다.
따라서, 입력값을 20byte입력해야하므로 0x21DD09EC에서 나누기 5를 하였다.
여기서 주의할 점은 "0x21DD09EC 나눈 값의 나머지 4가 남게된다."
즉, " (0x6C5CEC8 * 5) + 0x4 = 0x21DD09EC "가 되는 것이다.
그러면, 하나는 0x6C5CEC8에 0x04를 더한 값을 넣어주면 되는 것이다.
즉, "(0x6C5CEC8 * 4) + 0x6C5CECC = 0x21DD09EC"가 된다.
이를 리틀엔디안방식으로 바꿔서, 값을 입력하면 FLAG를 획득할 수 있다.
3. Exploit Code
from pwn import *
p = ssh("col","pwnable.kr",port=2222,password="guest")
arg = b'\xC8\xCE\xC5\x06\xC8\xCE\xC5\x06\xC8\xCE\xC5\x06\xC8\xCE\xC5\x06\xCC\xCE\xC5\x06'
p1 = p.process(['./col',arg])
print(p1.recvuntil('\n').decode())
4. flag 획득
간단하게도 flag를 확인할 수 있는 방법도 존재한다.
2가지 방안으로 flag를 획득해보았습니다.
킥킥😁 다음문제 풀러 Bye ~~ (✿◕‿◕✿)
'War game > pwnable.kr' 카테고리의 다른 글
[pwnable] random 풀이 (0) | 2022.02.13 |
---|---|
[pwnable] flag 풀이 (0) | 2022.02.12 |
[pwnable] input 풀이 (0) | 2022.02.07 |
[pwnable] asm 풀이 (0) | 2022.01.21 |
[pwnable] bof 풀이 (0) | 2022.01.20 |