일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- N0Named
- vinetto
- 정보처리기사 필기 합격
- 윈도우 프로세스 종류
- ftz
- 생활코딩
- Window process
- network
- CTF-D
- 포렌식
- 실기
- 네트워크 보안
- disk
- slack space
- 네트워크관리사2급
- memory
- pythonchallenge
- 는 하지마...
- 24시간의 전사
- 2022시작
- ZIP 파일구조
- 생활코딩 html
- html
- 디지털포렌식 with CTF
- Multimedia
- blkls
- 윈도우 프로세스
- 디지털포렌식
- Multimeida
- 슬퍼유
- Today
- Total
목록challenge/pwn (29)
ssoL2 TISTORY
Daddy told me I should study arm. But I prefer to study my leg! Download : http://pwnable.kr/bin/leg.c Download : http://pwnable.kr/bin/leg.asm ssh leg@pwnable.kr -p2222 (pw:guest) #include #include int key1(){ asm("mov r3, pc\n"); } int key2(){ asm( "push{r6}\n" "addr6, pc, $1\n" "bxr6\n" ".code 16\n" "movr3, pc\n" "addr3, $0x4\n" "push{r3}\n" "pop{pc}\n" ".code32\n" "pop{r6}\n" ); } int key3()..
Mom? how can I pass my input to a computer program? ssh input2@pwnable.kr -p2222 (pw:guest) #include #include #include #include #include int main(int argc, char* argv[], char* envp[]){ printf("Welcome to pwnable.kr\n"); printf("Let's see if you know how to give input to program\n"); printf("Just give me correct inputs then you will get the flag :)\n"); // argv if(argc != 100) return 0; if(strcmp..
Daddy, teach me how to use random value in programming! ssh random@pwnable.kr -p2222 (pw:guest) #include int main(){ unsigned int random; random = rand(); // random value! unsigned int key=0; scanf("%d", &key); if( (key ^ random) == 0xdeadbeef ){ printf("Good!\n"); system("/bin/cat flag"); return 0; } printf("Wrong, maybe you should try 2^32 cases.\n"); return 0; } 1. rand() 함수는 seed가 일정해서 계속 동일..
Mommy told me to make a passcode based login system. My initial C code was compiled without any error! Well, there was some compiler warning, but who cares about that? #include #include 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 : "); scan..
attackme가 존재하고 hint로 코드를 살펴봅시다. 굉장히 긴 코드 등장. 역대급 코드 인정? (그래서 원래 가운데 정렬하는데 이번에는 왼쪽 정렬한다..쓸게 많아,,) 코드를 읽어보면서 중요한 것들만 골라내면 다음과 같다. 1. count >=100이면 "뭐하는거냐?" 문구 출력 2. check == 0xdeadbeef이면 shellout() 실행 => shell권한 획득 !! **중요 3. read 함수로 stdin 입력 받은 것을 1 byte씩 x에 저장 3-1. x가 '\r', '\n'이면 "\a" 출력 3-2. x가 0x08이면 count 1 빼고, "\b \b" 출력 3-3. 위 두 경우가 아니라면 string[count]에 변수 x값을 넣고, count 1 더한다. 결론적으로 다음 쉘을 ..
오랜만 ^^ 마저 남은 FTZ 끝내겠습니당 ^_^* 코드를 보면 LEVEL 16이랑 다른건 오직 하나! 그저 call 포인터를 우회할 함수가 없다는 것? buf bof일으키고 call 함수는 직접 쉘코드 환경변수를 만들어서 그 주소로 가리킬 것이다. export로 "SHELLCODE"라는 환경변수를 등록했고, 쉘코드는 25 byte짜리를 사용했는데 너무 길어서 캡쳐 짤린 것이다. 이때, "\x90"도 넣어줌으로써 안전하게 ^^ 쉘코드는 아래 주소에서 참고하였다. 쉘코드 모음 -> m.blog.naver.com/mathboy7/220215329450 env로 확인해보니 "SHELLCODE"가 생성됨을 알 수 있다. /home/level17/tmp로 가서 shell.c를 만들어 "SHELLCODE" 환경변수..
level16 / about to cause mass hint를 봅시다. main 함수를 보면 call 함수 포인터 선언하고 buf bof 일으켜서 printit 가리키던 것을 shell로 덮으면 되는 문제이다. 찾아야 하는 건 buf 위치, call 위치, shell 주소 이렇게 3 가지 찾으면 되겠습니다~ 처음으로 c 코드 있어서 보려했더만 접근이 안되는구만,,^^; gdb로 살펴보겠습니당~ mov 어셈블리에서 주소를 ebp-16에 넣는 걸 보면 ebp-16이 call 함수 위치네유~ 이후 fgets의 인자로 사용되는 buf는 ebp-56이구용~ buf 위치와 call 위치를 찾았으니 bof 일으켜서 call에 넣을 shell 주소를 찾아봅시당~~ shell 함수는 전역 함수니까 main 위에 위치해..
level15 / guess what level14와 같은 문젠데 하나 다른 점은 check이 포인터 변수라는 점! buf에 bof일으켜서 check을 0xdeadbeef가 담긴 주소를 가리키게 만들면 된다. 현재 해야할 것은 0xdeadbeef 주소 찾기. gdb로 살펴보면 fgets의 인자로 사용하는 buf는 ebp-56에 위치하고, cmp로 비교하는 check 포인터 변수는 ebp-16에 위치한다. 포인터 변수는 그냥 변수랑 비슷한데 다른 점은 가리킬 주소를 담고 있다는 것이다. 따라서 0xdeadbeef가 아닌 0xdeadbeef를 "담고 있는" 주소를 담아야하므로 해당 주소를 찾아야한다. 0xdeadbeef와 변수를 비교하는데, 메모리에 직접 로드되야하므로 어딘가엔 있을 것이다. 그래서 직접 활..
level14 / what that nigga want? level14부터도 bof에 대해 푸나봅니다. 아무튼 문제를 보면 fgets로 인한 bof 문제이고, 조건으로 check에 0xdeadbeef가 있으면 자동으로 쉘 실행되네요. 그럼 bof 일으키고 중간에 check 변수만 제대로 해주면 그냥 풀리는 문제. gdb로 스택 구조를 살펴봅시다. fgets 함수 인자로 사용되는 buf는 ebp-56에 위치하고, if문인 cmp를 보면 0xdeadbeef와 비교하는 ebp-16이 check 변수 위치임을 알 수 있습니다. 그러면 최종적으로 아래와 같은 구조를 갖습니다. buf와 첫번째 dummy에 NOP을 덮고 check에 0xdeadbeek를 덮으면 자동으로 쉘이 출력되는 구조입니당 이 문제는 다른 문제..
level13 / have no clue hint를 봅시다. 인자는 1개 이상이고, 그 인자를 bof하는 문제인 것 같다. 하지만 i 변수가 변하지 않는 조건으로 bof 해야 하는 문제이다. i를 침범하면 kill 시스템콜로 프로세스가 죽는다. gdb로 i 변수와 buf 배열 사이의 간격을 찾아봅시다. strcpy의 인자인 buf는 ebp-1048 위치에 있으며 if는 cmp로 ebp-12에 있는 값과 0x1234567과 비교하므로 i는 ebp-12에 위치한다. 따라서 ebp-1048는 buf 위치고 ebp-12는 i 위치이므로 구조는 아래와 같다. buf랑 dummy 두 개에는 NOP으로 채우고 i는 그대로 0x1234567로 변조하지 않게 한 뒤에 level 11, level12에서 풀었던 방법인 R..
level12 / it is like this hint를 보니 LEVEL 11과 매우 유사한 문제이다. LEVEL 11에선 strcpy bof였다면 이 문제는 gets bof 문제이다. LEVEL 11 했던 것처럼 RTL 기법으로 풀어봅시다. gdb로 gets 인자로 사용한 STR 변수 위치 알아봤더니 EBP-264입니다. buffer(264) + ebp(4) + system주소 + nop(4) + /bin/sh주소 구조로 exploit 작성할 것이다. 필요한 system 주소와 /bin/sh 주소를 알아봅시다. ldd 명령어로 라이브러리 획득 해당 라이브러리에서 system 주소(\x4203f2c0)와 /bin/sh 주소(\x42127ea4) 획득 (이때 /bin/sh 주소 앞에 \x42 생략됨) (-..
level11 / what!@#$? hint를 보니 strcpy 함수를 이용한 bof 문제인듯! Setuid도 걸려있으니까 str을 bof해서 쉘코드를 넣으면 되겠다. 정확한 스택 구조를 알기 위해서 gdb로 살펴봅시다. main 함수에서 사용하는 strcpy 함수에서 인자로 사용되는 STR 변수의 위치를 알아냄 => EBP-264 그런데 이 문제에서는 쉘코드를 STR 변수에 넣고 RET에 STR 변수 "주소"를 직접 넣어야 하므로 정확한 STR 주소를 알기 위해서 breakpoint를 이용합시다. breakpoint를 strcpy 함수가 끝난 부분에 걸어서 인자값을 넣을 때 어느 위치에 위치해있는지 확인합시다. "a"를 100번 넣어서 주소를 확인하려 했는데 "Couldn't get registers:..