FTZ level18pw : why did you do it 레벨 18입니다. hint를 보겠습니다. 코드가 꽤 깁니다. 코드를 보겠습니다. 이 문제에서 FD 파일디스크립터에 대해서 좀 나오는데 굳이 안 필요한 내용이니 구글링을 부탁드립니다. 먼저 이렇게 지역변수들이 선언되어있습니다. count가 아직 뭔지 모르고 별로 안중요한 if문인 것 같습니다. 그 다음 if문이 중요해 보이는데요 check 변수의 값이 0xdeadbeef이면 shellout이라는 함수를 실행합니다. shellout함수는 sh을 실행시켜주는 함수입니다. 그리고 중요한 부분인데요. read함수로 입력을 받고 \r, \n, 0x08 이라는 케이스가 있네요. 0x08에서 count를 줄여줍니다. 참고로 count의 초기값은 0입니다. 그..
FTZ level17pw : king poetic 레벨 17입니다. 먼저 hint를 보겠습니다. buf의 크기가 20바이트인데 입력은 48바이트 만큼 받군요. bof취약점이 존재합니다. 전 레벨과 차이점이 있다면 똑같이 printit이라는 함수를 호출해주지만, 아까는 메모리주소를 shell이라는 함수로 바꿔주었죠 하지만 이번에는 쉘을 실행시켜주는 함수가 존재하고있지 않습니다. 따라서 쉘코드를 이용해야 할 것 같습니다. setreuid가 걸려있으니 쉘코드로 쉘을 실행시키고 나면 권한을 얻을 수 있을 것 같습니다. call하는 부분을 찾아서 그 주소를 원하는 주소로 바꾸도록 하겠습니다. 먼저 call하는 부분을 찾기 위해서 분석을 해보겠습니다. 분석을 하기 위해서 tmp폴더로 복사하겠습니다. 보기편한 int..
FTZ level16pw : about to cause mass 레벨 16입니다. 먼저 hint를 보겠습니다. 함수가 여러개 있습니다. buf의 크기는 20이지만 48만큼의 입력을 받으니 bof취약점이 발생합니다.이 프로그램을 실행시키면 fgets로 입력을 받고 printit이라는 함수를 호출해줍니다. printit 함수가 아니라 shell 함수를 실행시켜주면 쉘을 얻을 수 있을 것 같습니다. 먼저 분석을 하기 위해 tmp폴더 안으로 복사하도록 하겠습니다. 보기 쉬운 intel형식으로 정했습니다. main의 어셈블리 코드 입니다. main의 스택 프레임은 0x38만큼 할당되어 있습니다. 0x38은 10진수로 56입니다. ebp-56부터 fgets로 입력을 받습니다. 따라서 esp부터 입력을 받네요. 제일..
FTZ level15pw : guess what 레벨 15입니다. 먼저 힌트를 보겠습니다. buf의 크기는 20이지만 45만큼 입력을 받으니 버퍼오버플로우가 발생합니다. check가 포인터군요. 아까와 조금 다른데, 포인터가 가르키는 값이 0xdeadbeef이면 쉘을 실행해줍니다. 코드상에 0xdeadbeef가 있으므로 main내에서 0xdeadbeef가 값인 주소를 포인터에 넣어주면 되겠네요! 먼저 분석을 하기 위해 tmp로 옮겨주겠습니다. 보기 쉬운 intel로 보겠습니다. 어셈블리 코드 입니다. 스택프레임이 0x38만큼 배정되어있습니다. 0x38은 10진수로 56입니다. ebp-56부터 입력을 받습니다. ebp-16이 *check 변수임을 알 수 있습니다. 따라서 esp+40만큼을 값을 넣어주고 e..
FTZ level14pw : what that nigga want? 레벨 14입니다. 먼저 힌트를 보겠습니다. 좋은 효과를 준다니 열심히 해야겠습니다. buf의 크기는 20인데 45만큼 입력을 받는군요. 이 또한 오버플로우 공격이 가능합니다.check의 값을 0xdeadbeef로 만들어야 하니 정확히 알기 위해 디버깅 해보겠습니다. 먼저 디버깅을 하기 위해 tmp에 파일을 옮기겠습니다. 보기 편한 intel방식으로 보겠습니다! main의 어셈블리 코드입니다. 0x38만큼 스택프레임을 구성하고 있습니다. 0x38은 10진수로 56입니다. 그 다음 중요한 부분입니다. ebp-16과 0xdeadbeef를 비교하고 있습니다. 따라서 check는 ebp-16이군요! 입력은 ebp-56부터 받는군요 따라서 입력을 ..
FTZ level13pw : it is like this 이번에도 NOP Sled로 풀까 했지만 해킹은 재밌는 방법이 많은걸요! 그래서 RTL기법을 이용해서 풀겠습니다. 먼저 hint를 보겠습니다. 코드를 보니 감이 오시나요? 여기에도 당연히 argv로 값을 받는데 검사를 하지 않으니 BOF가 일어나네요. 하지만 i라는 요상한 놈이 생겼습니다. i의 값이 0x1234567이 아니면 kill함수를 실행하는군요.. 저희는 bof로 ret을 조작해야하는데 bof를 하면 i값도 덮혀져서 저희의 목표를 이루지 못할 것 같습니다. 하지만 bof를 하면서 i의 값 부분을 0x1234567로 해주면 우회가 가능하겠죠?저는 이렇게 i값도 같이 컨트롤해서 ret에 도달할 것 입니다.하지만 기존 NOP sled방식말고 RT..
FTZ level 12pw : it is like this 레벨 12입니다. 레벨 11에서 한 bof와 공격방법은 비슷합니다. 먼저 힌트를 보겠습니다. 아까와 달라진 점이 보이시나요?argv로 입력을 받지 않고 gets함수로 입력을 받습니다. 당연히 버퍼오버플로우 취약점은 존재합니다. str의 크기도 똑같군요. 디버깅을 하기위해 tmp폴더로 옮겨주도록 하겠습니다. 어셈블리 코드를 보겠습니다. 아까와 같이 0x108(264)만큼의 스택 프레임이 형성되어 있습니다. gets 함수로 바뀌면서 아까와는 다른 방식으로 공격을 해야하는데요. 이번에도 NOP sled 로 풀어보겠습니다. 공격 시나리오를 생각해보겠습니다. 먼저 level11과 같은 스택 구조이기 때문에 227개의 nop과 25바이트의 shellcode..
FTZ level11pw : what!@#$? 드디어 이제부터 bof를 익히는 11레벨입니다. 먼저 ls명령을 통해 확인해보겠습니다. attackme 라는 setuid가 걸린 파일과 hint가 있군요! 힌트를 보겠습니다. argv[1]을 str변수안에 strcpy를 합니다. 여기서 bof취약점이 발생하게됩니다. 리턴 어드레스를 덮어서 값을 수정해 쉘코드가 있는 부분으로 점프해주면 되겠네요. NOP sled 방식으로 풀어보겠습니다. 디버깅을 하기위해 tmp폴더로 attackme파일을 옮기겠습니다. 그 후, gdb로 분석하도록 하겠습니다. 인텔로 바꾼 뒤 분석해보겠습니다. 0x108만큼 스택 프레임을 구성합니다. 264바이트입니다. 아까 str변수가 256바이트로 선언되어있으니 dummy는 8바이트 입니다...
- pwnable.tw
- TLS
- 본선가고싶다
- rt_sigreturn
- stack reusing
- ebp change
- FSB
- fastbindup
- pwnable
- HackCTF
- glibc
- codegate
- heap
- SQLi
- oob
- hacking
- fastbin
- exit
- srop
- fsop
- tcache
- shellcoding
- 해킹
- pwable
- overflow
- Total
- Today
- Yesterday