전체 글

· Wargame/FTZ
level18로 로그인하고 힌트를 보면 굉장히 긴 코드가 나온다. 다른 level에 없던 긴 코드에 조금 쫄았으나, 취약점은 굉장히 간단하다. #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) shellout(); else { FD_ZERO(&fds); FD_SET(..
· Wargame/FTZ
level17로 로그인한 후 hint 파일을 확인해보면, 역시 소스코드가 주어져 있다. level16과 마찬가지로 call에 printit가 들어가고 fgets를 통해 overflow가 일어나는데, 이번에는 shell을 얻게 해주는 함수가 없다. shell을 얻게 해주는 함수가 없으므로 쉘 코드를 환경변수에 삽입한 뒤 주소를 구한 뒤, stack overflow를 통해 call의 값을 쉘 코드가 들어간 환경변수의 주소로 변조해주면 될 것 같다. export 명령어로 쉘 코드를 환경변수에 등록한 뒤 미리 빌드해둔 tmp 폴더 내 env 파일을 실행해서 쉘 코드가 들어 있는 환경변수의 주소를 구했다.(앞에 \x90을 추가해준 이유는 \x90 없이 쉘 코드만 넣어준다면 제대로 쉘이 얻어지지 않기 때문이다.) ..
· Wargame/FTZ
level16으로 로그인한 후 hint 파일을 확인하면 마찬가지로 소스코드가 주어져 있다. 이번에는 shell을 얻게 해주는 shell 함수가 있어서 ret overwrite인가 했는데, 그게 아니라 bof를 통해 call 포인터의 값을 shell 함수의 주소로 변조하는 것이었다. 소스코드를 확인해보면 void형 포인터 변수 call에 printit 함수의 주소를 넣어주는데, 프로그램의 마지막에서 이 call에 들어 있는 주소의 함수를 실행해 준다. 참고로 이 printit 함수는 "Hello there!\n"를 출력시켜주는 기능을 한다. 마찬가지로 fgets 함수로 buf의 크기보다 큰 48byte 입력을 받는데, 여기서 buf의 크기는 20byte이므로 28byte의 overflow가 일어난다. 이를..
· Wargame/FTZ
level15로 로그인한 후 hint 파일을 확인하면 level14의 힌트 코드와 비슷한 코드가 나온다. 다른 점은 0xdeadbeef와 비교하는 대상이 check의 값이 아닌 포인터를 써줘서 check의 값이 가리키는 주소의 값이다. 마찬가지로 buf의 크기는 20이지만 fgets 함수를 통해 45byte만큼 입력을 받기 때문에 25byte overflow 된다. 원래는 hint 파일의 소스 코드를 복사해 tmp 폴더에서 새 파일을 빌드하고 디버깅했지만, 이번 문제의 경우 주소가 굉장히 중요하므로 똑같은 환경에서 분석하기 위해 cp 명령어로 문제 파일을 tmp 폴더에 복사했다. (처음에는 멋모르고 복사해서 새로 빌드했다가 주소 값이 안 맞아 exploit에 난항을 겪었다) gdb를 통해 buf와 che..
보호되어 있는 글입니다.
이번에 풀이할 문제는 vulnhub의 basic pentesting 문제다. 지금까지 풀이한 wargame들과 다르게 vulnhub는 가상머신을 제공해주는데, 해당 가상머신에서 취약점을 찾아 최종적으로 root 권한을 얻는 것이 목적이다. 모의해킹 wargame이라고 생각하면 된다. 문제 파일을 다운받고 vmware를 통해 환경을 구축한뒤 부팅해봤다.(network 설정은 NAT로 했다.) 로그인 화면이 나타나는데, id는 marlinspike로 고정된 것을 알 수 있다. 당연히 password는 주어지지 않는다. FTZ, LOB 같은 가상머신 wargame을 상상했던 나는, password 정보가 주어지지 않아 처음에 많이 해맸다. 모의 해킹의 절차를 참고하여 단계를 선정해서 풀이를 진행하겠다. 1. ..
· CTF
이번에 풀이할 문제는 wtfCTF의 k3Y 문제다. 문제 파일과 nc 서버 주소가 주어져 있다. 문제 파일을 ida로 열어 main 코드를 확인해본 모습이다. v5에 rand 함수로 값을 넣은 후 사용자의 입력 값과 xor 연산을 해 -1393689906과 같으면 flag를 얻게 해주는데, 문제는 rand 함수를 쓰기전 srand 함수를 통해 seed 값을 넣어주지 않는다면 랜덤한 값이 나오지 않고, 항상 똑같은 값만 반환된다. 따라서 gdb를 통해 문제 파일을 열어 rand 함수에서 반환되는 값을 알아낸다면 입력 값으로 뭘 줘야 flag를 얻을 수 있는지 알 수 있다. rand로 생성되는 값이 0x6b8b4567인 것을 알 수 있다. 그렇다면 -1393689906 xor 0x6b8b4567한 값을 입력..
· CTF
이번에 풀이할 문제는 wtfCTF 2021의 MoM5m4g1c 문제다. c언어 소스 코드와 nc 서버가 주어져 있다. 일단 bof에 취약한 gets 함수가 보인다. int형 변수 water에 0을 넣은 후, gets 함수를 통해 125byte 크기의 char형 배열 bottle에 입력을 받는다. 그 다음 water의 값이 0인지 체크한 후 0이 아니라면 flag를 얻게 해준다. 간단한 stack buffer overflow 문제다. 200byte 정도의 더미 값을 넣어준다면 오버플로우를 통해 water의 값이 변조돼 flag를 얻을 수 있을 것 같다. from pwn import * p = remote("20.42.99.115", 3000) p.sendline('A'*30) p.interactive() ..
· Wargame/FTZ
level14로 로그인한 후 hint 파일을 확인해보면 마찬가지로 attackme의 소스코드가 나온다. 딱 봐도 char형 배열인 buf의 크기가 20이지만 fgets 함수로 45byte만큼 입력을 받기 때문에 stack buffer overflow가 일어난다. fgets 아랫줄에서 check 변수의 값이 0xdeadbeef라면 쉘을 얻게 해 주는데, check 변수의 값은 0xdeadbeef가 아니므로 정상적인 입력으로는 쉘을 얻을 수 없다. 하지만 fgets 함수를 통해 buf에서 bof가 일어나므로 check의 값을 변조해 0xdeadbeef로 만들어 쉘을 얻을 수 있다. 일단 문제 파일은 디버깅이 불가능하므로 소스 코드를 복사해서 tmp 폴더에 파일을 빌드하고 gdb로 열었다. fgets 함수 호..
· Wargame/FTZ
level13으로 로그인 후 hint 파일을 확인해보면 마찬가지로 소스코드가 주어진다. 확인해보면 인자 값을 1024 크기의 char형 배열 buf로 strcpy 함수를 이용해 복사하는데, 문제는 strcpy 함수가 bof에 취약한 함수라는 것이다. 이를 통해 stack buffer overflow를 일으켜 ret를 쉘 코드의 스택 위치나 환경 변수의 주소로 변조한다면 쉘을 얻을 수 있을 것이다. 하지만 문제는 ssp 보호기법의 canary와 비슷한 로직이 존재하다는 것이다. i에 0x1234567을 넣고 마지막 함수를 끝내기전에 i의 값이 그대로인지 검사하는데, 만약 bof를 일으켜 더미 값을 채워 ret를 조작하려 시도한다면, buf와 ret 사이에 있는 i를 변조하게 돼 canary 검증 로직을 통..
보호되어 있는 글입니다.
보호되어 있는 글입니다.
dyp4r
dyp4r's Study Blog