일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 성남 코로나 확진자
- 킹덤 고근희
- 성남은혜의강교회
- 불가피
- 김재석
- 임영규
- 픽크루
- 유튜버 김재석
- 이태원 클라쓰 15회 예고
- 뭉쳐야 찬다
- 폰폰테스트
- 미국 금리인하
- 학교 개학 연기 4월
- 스콜피온킹
- 최강욱
- 김영권
- 은혜의 강 교회
- 홍혜걸
- 조희연
- 고민정
- 제넥신
- 이상형 만들기
- 스페인 코로나
- 해킹
- 이지혜
- 금리인하
- 양적완화
- 리리남매
- 김영권 아내
- libtins
Archives
- Today
- Total
Dork's port
Pwnable.kr col 풀이 본문
col 풀이를 시작하도록 하겠습니다.
소스코드를 보도록 하죠
#include <stdio.h> #include <string.h> unsigned long hashcode = 0x21DD09EC; //결과 값 비교를 위한 hashcode unsigned long check_password(const char* p){ int* ip = (int*)p; //인자 값 p를 포인터 변수 ip에 저장 int i; int res=0; for(i=0; i<5; i++){ //5번의 루프를 돌며 res에 누산 후 값을 res에 저장 res += ip[i]; } return res; // res 리턴 이때 이 값이 hashcode와 같아야 함 } 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] )){ //hashcode 변수와 check_password의 retrun value 비교 후 같을 시 flag 출력 system("/bin/cat flag"); return 0; } else printf("wrong passcode.\n"); return 0; }
주석과 같이 해석할 수 있겠습니다.
그렇다면 5번 더한 값이 0x21DD09EC와 같아야 하는데 간단하게 하기 위해선 5로 나누면 되겠죠?
하지만 이때 저 값이 5의 배수가 아니므로 (끝자리가 24입니다) 1을 더한 후 5로 나눈 값에 마지막 파라미터 값을 1을 빼준 값을 인자로 전달하였습니다.
코드로는 아래와 같이 적을 수 있겠네요!
짜잔~ 끝났습니다.
확실히 코드를 해석하는 능력이 중요한 것 같아요 :)
'Pwnable.kr' 카테고리의 다른 글
pwnable.kr flag 풀이 (0) | 2018.08.24 |
---|---|
Pwnable.kr bof풀이 (0) | 2018.08.21 |
Pwnable.kr fd 풀이 (0) | 2018.05.29 |
Comments