일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 운정 소바동
- graphql with reactnative
- graphql with RN
- useMutation error
- apollo react native
- 홍대 카페 장쌤
- graphql mutation error
- 홍대 예술
- graphql 400
- 잠실새내 도그존
- promise메서드
- 지보싶 신촌점
- graphql react native
- 신촌 소문난집
- 화이트해커를 위한 웹 해킹의 기술
- 홍대 토라비
- 금별맥주
- promise처리
- 예쁜술집 예술
- 앙버터마카롱
- typescript
- 비동기배열처리방법
- 도그존
- graphql
- apolloclient
- 화이트 해커를 위한 웹 해킹의 기술
- 토라비
- 비동기배열
- 고르드
- 잠실새내
- Today
- Total
목록wargame 풀이/FTZ (20)
yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆
id: level20 pw: we are just regular guys 이번에는 fgets에서 79바이트만 읽기 때문에 BOF를 사용할 수 없다. printf(bleh)를 보면 일반적이지 않은 형식으로 bleh를 출력하고 있다. C언어에서는 출력할 때 %d, %s, %c 등 과 같은 형식 지정자를 사용하는데 여기서는 이를 사용하지 않아 FSB(포맷 스트링 버그)가 발생한다. FSB 위와 같이 문자열만 입력하는 것이 아니라 %x와 같은 형식 지정자가 일반 문자열에 포함되어 있으면 문자열을 출력할 뿐만 아니라 서식문자가 명령어처럼 실행되어 문자열로 입력하지 않은 부분이 출력되는 것을 볼 수 있다. 다음과 같이 스택이 구성되어 있을 때 print(bleh)가 실행되면 스택의 &bleh에서 바로 bleh의 내..
id: level19 pw: swimming in pink 이번에도 hint를 읽어보자 gets 함수에는 BOF 취약점이 존재하니 이를 이용하고 이번에는 setreuid 함수가 존재하지 않는다. 즉 attackme를 실행하고 쉘을 띄워도 level19로만 실행이된다. 따라서 이번에는 setreuid 기능을 포함하고, 쉘을 띄우는 쉘 코드를 이용해야한다. setreuid+ 쉘을 띄우는 쉘 코드(47bytes): \x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80\x3..
id: level18 pw: why did you do it hint를 읽었더니 attackme 파일의 코드가 나왔다. 좀 많이 길어서 주석을 달아보았당 //attackme code #include #include #include #include void shellout(void); int main() { char string[100]; int check; int x = 0; int count = 0; fd_set fds; //구조체 선언 printf("Enter your command: "); fflush(stdout);//표준 출력버퍼 비움 while(1) { if(count >= 100) printf("what are you trying to do?\n"); if(check == 0xdeadbeef..
id: level17 pw: king poetic level17의 힌트를 보자! level16이랑 굉장히 비슷하다! 다른 점은 level16에는 있던 shell() 함수가 level17의 attackme에는 존재하지 않는다. 하지만 권한을 level18로 바꾸어주는 setreuid는 있으므로 쉘을 띄워주는 쉘 코드를 환경변수에 등록하면 된다! 우선 main함수를 디스어셈블하자 디스어셈블 결과도 level16과 매우 똑같다. 그래도 스택 구조를 그려보자 스택 구조 역시 level16과 매우 똑같다. 달라진 점은 쉘코드를 환경변수에 넣고 환경변수 주소를 call 자리에 넣어야 한다는 점 뿐이다. 쉘 코드를 환경변수에 등록해주자! 이제 쉘 코드 시작 주소를 알아내는 shell.c 를 작성해서 컴파일 해주자 /..
id: level16 pw: about to cause mass 힌트를 읽어봅시다. (오늘은 즐거운 추석연휴♡) 이번에는 main 함수 뿐만 아니라 shell 함수와 printit 함수까지 볼 수 있다. main함수에서는 call포인터에 printit 함수의 주소를 넣어주고, fgets 이후에 call함수를 호출하고 있다. shell은 main함수에서는 호출되지 않았지만, setreuid와 shell을 띄워주는 기능을 한다. 그럼 fgets 취약점을 이용해 call에 printit의 주소가 아닌 shell함수의 시작주소를 넣어준다면? shell()함수가 호출되면서 level17 권한의 shell이 실행될 것이다! 스택 구조 파악을 위해 attackme 파일을 디스어셈블해주자 level14,15와 거의 비..
id: level15 pw: guess what 이번에도 hint를 읽으면서 시작해보장 level 14와 굉장히 비슷한 코드가 attackme의 코드로 나왔다. level14와 다른 점이 있다면 check가 포인터 변수라는 것! 그리고 조건문에서 check가 가리키는 값이 0xdeadbeef여야 한다는 점만 다르다! 따라서 check에 0xdeadbeef가 저장되어있는 주소를 넣어주어야한다. 우선 main함수를 디스어셈블 해서 스택 구조를 파악해보자 level14와 거의 똑같기 때문에 어셈블리어를 따로 해석하지는 않을 예정 ( 2020/09/28 - [wargame 풀이/FTZ] - FTZ level14 풀이 요기에 있음) 이를 바탕으로 그려본 스택 구조는 다음과 같다 (얘도 사실 level14와 똑같음..
id: level14 pw: what that nigga want? level14에 로그인 하고 hint를 열어보았다. 이번에는 main 함수 안에 쉘을 띄워주는 코드가 있기 때문에 굳이 쉘 코드를 사용할 필요가 없어보인다. int형 변수 crap과 check, 그리고 char 배열 buf가 보인다. fgets로 45바이트를 입력받고 있는데, buf의 크기는 20이다 -> overflow해서 다른 영역에 접근 가능 그런데 쉘을 띄워주는 부분이 조건문 안에 있다. check와 0xdeadbeef가 같으면 level15권한으로 쉘이 띄워지는 듯 하다. check의 위치 파악을 위해 attackme를 tmp에 복사하고 gdb를 실행해보자 main함수를 디스어셈블 했더니 위와 같은 결과를 알 수 있었다. che..
id: level13 pw: have no clue hint를 보았더니 다음과 같은 코드가 나왔다. 이번에도 strcpy를 사용했기 때문에 BOF 취약점이 존재한다. 그런데 (long) i 값이 0x1234567이 아니면 BOF 경고를 띄워주고 프로그램을 강제 종료시킨다. 이를 방지하려면 공격을 할 때 i자리에는 0x1234567을 그대로 넣어주어야한다. 이제 스택 구조를 알아보기 위해 attackme를 tmp에 복사하고 gdb를 실행시켜주자 main함수를 디스어셈블 했더니 위와 같은 정보를 얻었다. 이를 바탕으로 스택 구조를 그려봤다. 이번에도 환경변수를 생성해서 환경변수에 쉘 코드를 넣고 환경변수의 주소를 return address에 넣어줄 것이다. 하지만 i에는 0x1234567을 넣어주어야 하기 ..
id: level12 pw: it is like this hint를 확인해보자 level11과 매우 비슷한 코드다! 하지만 level11에서는 strcpy 함수를 사용해서 str에 입력했다면, level12에서는 gets를 이용해서 str에 값을 대입한다. (gets 함수 역시 BOF에 취약한 함수이다. 길이 제한 없이 입력받기 때문!) 일단 attackme 파일을 디스어셈블 해주고 스택 구조를 파악해보자 main+3에서 스택을 264바이트 확보했고, main+9에서는 8바이트 더 확보했다. main+49에서 eax에 ebp-264의 주소를 대입하고 이를 gets함수의 인자로 넣는걸로 보아 ebp-264가 str의 시작 주소임을 알 수 있다. 이 정보들을 가지고 스택 구조를 그려보았다! (사실 level..
id: level11 pw: what!@#$? 이번에는 attackme 실행파일과 hint 파일이 존재한다. (attackme 파일에는 setuid가 설정되어있다.) hint를 읽어보았더니 attackme의 소스코드를 보여준 것 같다. //hint 내용 attackme 실행파일의 코드인 듯 #include #include int main( int argc, char *argv[] ) { char str[256];//str 문자열 setreuid( 3092, 3092 );//권한을 나타냄, level12 strcpy( str, argv[1] );//입력 값(argv[1])을 str에 복사 //strcpy에는 BOF 취약점이 있다. 입력받는 문자열 크기를 받지 않아 원하는 만큼 입력할 수 있다. printf..