코드를 보면 system 함수를 실행시켜 bash 쉘을 실행시키고 echo shock_me 즉 shock_me를 출력하는 코드가 실행됩니다. 여기서 쓸 수 있는 취약점이 바로 shellshock 라는 취약점인데, 원리를 간단하게 설명하자면 쉘이 시작될 때 쉘이 환경 변수의 값을 읽어서 세팅을 하는데 이때 읽어오는 환경변수의 값 중에 쉘을 실행시키는 명령이 있으면 쉘이 따여지게 되버리는 취약점입니다. 이런식으로 환경변수를 생성하면 쉘이 실행되고 환경 변수를 읽어 올 때() { :;} 함수는 정의가 되고 그 뒤에 있는 echo hello라는 명령은 아마 실행이 될 겁니다. 실행이 되네요. 그렇다면 여기서 echo hello를 쉘을 따는 명령으로 바꾸어 봅시다. 이렇게 되면 함수가 정의되고 bash라는 명령어..
random 문제 입니다. random = rand(); 즉 난수를 만드는 과정에서 시드를 초기화를 안해주었네요. 이렇게 되면 매 번 실행할 때마다 같은 난수가 나오게 됩니다. 즉, 난수가 난수가 아니란 말입니다. 그렇다면 저 random 의 값을 찾아주기만 한다면 쉽게 풀 수 있겠네요. gdb로 main 함수를 디버깅 해보았습니다. 에 난수함수를 호출하는게 보이시나요? 그리고 결과 값을 [rbp-0x4]에 넣는 것이 보입니다. 이로보아 random 변수의 위치는 rbp-0x4 라는 것을 유추해 낼 수 있겠습니다. cmp 즉 key 값과 random 값의 xor 결과를 0xdeadbeef 와 비교하는 구문에 bp를 걸고 실행시켜 보았습니다. rbp-0x4 에는 random 변수의 값인 0x6b8b4567..
코드가 길어요,, 문제 힌트를 보면 이 코드에는 컴파일 경고가 있다고 하는데 뭘까 고민하다 보니까 바로 scanf에 변수를 저장받는 부분에서 &가 빠져 있는 것을 보았습니다. &의 역할을 알아보자면 예를 들어 scanf(“%d”, &a); 라면 a라는 변수의 주소에 값을 저장한다라는 뜻인데, scanf(“%d”, a); 라고 쓰게 되면, a의 값의 주소에 값을 넣겠다는 겁니다. 즉, a의 초기값이 = 0xbffffa78 이라면 0xbffffa78 부분에 값을 저장하겠다는 뜻이죠. 이 취약점을 활용해서 exploit이 가능할 것 같습니다. 먼저 name[100] 배열의 주소와 passcode1 의 주소를 찾아야 저 취약점을 활용할 수 있겠죠. welcome 함수를 gdb로 까본 결과 scanf 함수 실행전..
코드를 보게 되면 func 함수에서 32byte 만큼 배열을 선언해주고 gets 로 입력을 받는 것을 알 수 있습니다. 아마 이 부분에서 bof가 나겠네요. gdb 로 파일을 까보았습니다. 부분에 eax에 [ebp-0x2c]의 주소를 넣는 것이 보이시나요? 그리고 부분에서 [ebp+0x8] 과 0xcafebabe를 비교하는 것을 볼 수 있습니다. 이것으로 보아 int key의 위치는 ebp+0x8 이 될 것이고, 버퍼의 시작주소는 0x2c가 되겠네요! 2c+8 만큼 a를 넣어주고 그 다음부터는 0xcafebabe를 넣어 주게 되면..! 쉘이 따이는 것이죠.
코드를 보면 argv[1] 은 20byte 여야하고 check_password 에서 20byte 짜리 char형 배열을int 형으로 바꾸는 것을 볼 수 있습니다. 그리고 각 배열의 모든 값의 합을 hashcode와 비교하고 맞으면 flag를 출력해주는 것을 알 수 있습니다. 5번 더하는 것으로 보아 hasecode 를 5로 나누어 주면 되겠네요. 그리고 나머지가 4가 남으니 4개는 그대로 넣어주고 마지막 하나는 4를 더한 값을 넣어줍니다.
코드를 보면 fd 에 argv[1] 이 ascii 값을 int 값으로 바꾸어주고 - 0x1234와 빼는 것을 알 수 있고, 그대로 read 함수 인자에 fd, buf, 32 이렇게 들어가는 것을 볼 수 있습니다. 여기서 read 함수 인자를 살펴보면, 첫번째 인자인 fd 는 파일 디스크립터로 0 - 표준 입력(stdin)1 - 표준 출력(stdout)2 - 표준 에러(stderr) 우리는 입력을 할 것이기 때문에 fd를 0으로 맞추어주고 buf에 LETMEWIN을 넣고 엔터를 치면 flag가 나올 것 같습니다. atoi(argv[1]) - 0x1234 여기서 0x1234 의 십진수 값이 4660이라는 것을 알고 0으로 맞추어 주기 위해서 4660을 출력합니다. 그리고 LETMEWIN을 입력해주니 flag..
- Total
- Today
- Yesterday
- Nightmare
- 올리디버거
- 0ctf
- luckyzzang
- zombie_assassin
- 포너블
- Golem
- bugbear
- Codegate
- Python
- 비교 연산자
- darkknight
- 파이썬
- C언어
- 리버싱
- lob
- orge
- babyheap
- HarekazeCTF
- angry_doraemon
- 클래스
- OllyDbg
- TAMUCTF
- ftz
- succubus
- protostar
- picoctf
- BaskinRobins31
- babypwn
- Pwnable.kr
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |