command injection을 공부하다가 좋은 문제가 있어서 풀이를 쓰게 되었습니다. 이 문제는 defcon 2015 예선문제 입니다. 원래 remote환경에서의 문제인데 저는 바이너리 파일을 구해서 제 서버에서 풀었습니다. flag파일은 제가 만들었습니다. babycmd를 실행해보면,4가지의 명령어를 실행시켜준다고 합니다. ping명령어가 잘 수행됩니다. dig 명령도 잘 수행 됩니다. 당연히 host 명령도 잘 수행됩니다. 이제 바이너리 파일을 분석하기 위해 ida를 이용해 보겠습니다. 여기서 쓰이는 함수들은 아마 저 명령어들을 실행시켜주는 함수겠죠? 좀 더 자세히 보기 위해 ping일 때 사용되는 함수인 sub_E35를 보겠습니다. 여기가 중요한 부분인 것 같은데요. sub_D65함수가 무엇인지..
1. NC 연결remote(IP, PORT) 형식으로 연결.IP는 str이고 port는 int형임에 주의p = remote("localhost",1234) 2. Local nc 다음으로 많이 쓰는 local 경우에는 process("PATH") 식으로 연결PATH도 마찬가지로 strp = process("./test") 3. ssh 젤 많이 안쓰이지만 pwnable.kr 쓸 경우 많이 나옴 ssh(username, IP, PORT, PASSWORD) 꼴로 연결, USERNAME, IP, PASSWORD 는 str PORT는 int PORT와 PASSWORD는 각각 앞에 port=, password= 를 붙힘. p = ssh("test", "localhost", post=1234,password="test..
FTZ level19pw : swimming in pink 레벨 19입니다. 먼저 hint를 보겠습니다. 간단합니다. setuid도 걸려있지 않고 그냥 gets로만 입력을 받네요. 버퍼오버플로우가 발생합니다. 그냥 setuid 걸어주고 쉘코드를 이용하면 될 것 같습니다. 먼저 분석하겠습니다. 분석하기 위해서 tmp폴더로 파일을 옮기겠습니다. gdb로 분석을 해주겠습니다. 보기편한 intel방식을 사용하겠습니다. main의 어셈블리 코드입니다. 스택프레임이 0x28만큼 구성되어있습니다. 0x28은 10진수로 40입니다. ebp-40부터 입력을 받습니다. 따라서 esp부터 입력을 받는군요. 그러면 buf 40 + sfp + ret 이렇게 될 것 같습니다. 그럼 bof로 sfp까지 덮어준 뒤 ret을 조작해주..
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부터 받는군요 따라서 입력을 ..
- oob
- glibc
- fsop
- stack reusing
- pwable
- tcache
- fastbin
- overflow
- fastbindup
- FSB
- HackCTF
- pwnable
- SQLi
- pwnable.tw
- srop
- hacking
- codegate
- rt_sigreturn
- ebp change
- TLS
- 해킹
- shellcoding
- 본선가고싶다
- exit
- heap
- Total
- Today
- Yesterday