[Pwnable] 해커스쿨 FTZ (20) 썸네일형 리스트형 [해커스쿨 FTZ] level20 드 디 어ㅓㅓㅓㅓ 마지막 level20 이다! 로그인을 하고, 파일 목록을 확인하고, 힌트를 확인한다. 코드를 분석해보자. 흠 뭔가 이상하다. bleh 를 80바이트로 할당했는데 79바이트만 입력받는다. => bof 공격으로 ret 값 변조가 불가능하다. 그리고 printf 함수에서 %s 인자 없이 매개변수를 받는다 => 포맷스트링버그 문제이다. #Format String Bug란 Format String Bug(FSB)의 취약점은 Format String ( %s, %x ,,,와 같은 C언어의 변환 명세) 의 버그를 이용해 메모리를 바꿀 수 있다는 것이다. 위 사진처럼 A 라는 일반 문자와 16 진수를 출력하는 %x (Format String)를 입력하면 %x 에 의해 메모리를 읽어 16진수로 나타내준.. [해커스쿨 FTZ] level19 마지막에서 두번째 단계 level19 를 풀어보자. 로그인을 하고, 파일 목록을 확인하고, 힌트를 확인하자. 이번 코드는 좀 간단해보인다. setreuid 도 /bin/sh 도 없으니 쉘코드를 이용해야겠다. 지금까지 사용했던 25바이트 쉘코드(\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) 는 setreuid 가 포함되어 있지 않은 코드다. 그렇다면 setreuid가 포함되어있는 41바이트 쉘코드를 사용하자. \x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73.. [해커스쿨 FTZ] level18 이번엔 level18 이다. 두문제 남았다... 로그인을 하고 파일목록을 확인하고, 힌트를 확인하는데 이번엔 힌트가 꽤 길다. 흠.. 코드를 분석해보자. 이걸 종합해서 간단하게 설명하면 check 변수의 값이 0xdeadbeef 면 shellout 함수를 호출해서 쉘을 실행하는 프로그램이다. 하지만 이전 문제들과는 다르게 string[100] 선인보다 check 변수 선언이 뒤에 나와서 지금까지 해온 방법을 쓸 수가 없다. 눈여겨볼 부분은 count 변수에 0x08 이 입력으로 들어오면 1 감소시킨다는 것인데 이는 배열의 인덱스가 -(마이너스) 가 되게하면 뒤에 나온 check 변수까지 접근을 할 수 있다는 뜻이다. 대충 방법을 생각해놨으니 해야 할것을 적어보자. ⓐstring ~ check 사이의 거리.. [해커스쿨 FTZ] level17 이번엔 level17이다. 로그인을 하고, 파일 목록을 확인하고, 힌트를 확인한다. 코드를 분석해보자. level16 문제와 유사하지만 살짝 다르다. 이번엔 따로 쉘코드를 실행시키는 함수가 없기 때문에 환경변수를 이용해 쉘코드를 등록해보자. 그럼 해야 할 것은 ⓐbuf ~ *call 사이의 거리를 알아내고 ⓑ쉘코드를 환경변수에 등록해 그 주소를 알아낸 뒤 ⓒ*call 위치를 알아낸 쉘코드 주소로 덮어씌우면 될 것이다. gdb를 이용해 분석해보자. main+6 에서 *call ~ ret 사이의 거리를 알 수 있다. => 16 + 4 = 20 main+24에서 buf ~ ret 사이의 거리를 알 수 있다. => 56 + 4 = 60 buf ~ *call 사이의 거리 = 60 - 20 = 40 쉘코드를 환경변.. [해커스쿨 FTZ] level16 level16 이다. 고지가 얼마 남지 않았다! 로그인을 하고, 파일 목록을 확인하고, 힌트를 확인한다. 코드를 분석해보자. call 포인터 함수에 저장되어있는 printit 함수를 호출하는 코드이다. 이 printit 함수를 shell 함수로 바꾸어 저장한다면 마지막에 shell 함수가 호출되면서 다음 암호가 나올 것 같다. 그렇다면 해야 할 것은 ⓐbuf 와 *call 까지의 거리를 알아내고 ⓑshell 함수의 주소를 알아내 ⓒ그 주소를 *call위치에 넣어주면 될것이다. gdb로 정확하게 분석을 해보자. 일단 main 함수를 뜯어보자. buf 와 *call 사이의 거리 = 56 - 16 = 40 이다. ( buf ~ ret, *call ~ ret 사이의 거리는 둘다 4 이므로 결과에 관련이 없다.).. [해커스쿨 FTZ] level15 예전에 푼걸 한번에 올리려니 귀찮고 힘들다. 하지만 벌써 level15 ! 늘 그랬듯이 로그인을 하고, 파일 목록을 확인하고, 힌트를 확인한다. level14 와 상당히 유사하다. 차이점이라면 check를 포인터로 선언했다는것. 그렇다면 이번엔 check의 값에 0xdeadbeef가 존재하는 곳의 주소를 넣어줘야 한다. 해야 할걸 생각해보면, ⓐ0xdeadbeef 가 존재하는 주소를 찾고 ⓑbuf 와 *check 의 거리를 구해 ⓒ페이로드를 작성하면 될 것 같다. 우선 gdb를 통해 0xdeadbeef 가 존재하는 주소를 찾아보자. 0x80484b2 에 있는걸 확인했다. 이제 buf 와 *check 사이의 거리를 구해보자. level14와 동일하게 buf ~ ret 거리 = 56 + 4 = 60 *che.. [해커스쿨 FTZ] level14 어느새 level14 이다. 로그인을 하고, 파일 목록을 확인하고, 힌트를 확인한다. 대놓고 오버플로우와 포맷스트링 문제라고 말해준다. 이전에 level11부터 했던게 오버플로우, 포맷스트링 문제들이었다. 심화과정인가보다. 코드를 분석해보자. check가 buf보다 높은 주소이고, buf를 20으로 할당했으나 45까지 입력할 수 있다. 이제 해야 될건 ⓐbuf와 check의 거리를 구해서 ⓑcheck 위치에 0xdeadbeef를 넣어주면 된다. gdb로 정확한 분석을 해보자. main+17 에서 buf 에서 RET 까지의 거리를 구할 수 있다. buf ~ ebp 거리 = 56 buf ~ ret 거리 = 56 + 4 = 60 main+29 에서 check 에서 RET 까지의 거리를 구할 수 있다. chec.. [해커스쿨 FTZ] level13 이번엔 level13을 풀어보자. 로그인을 하고, 파일 목록을 확인하고, 힌트를 확인한다. 코드를 분석해보자. i 와 buf 의 스택구조만 살펴보면 높은주소 long i 낮은주소 char buf i 의 주소가 buf의 주소보다 높다. 따라서 i 의 주소를 덮어 쓸 수 있다! 우선 gdb를 통해 정확한 분석을 해보자. i 와 buf 의 거리를 구하면 문제를 풀 수 있을것같다. 우선 main+54 부분으로 buf와 ebp 까지의 거리를 구해보자. buf ~ ebp 거리 = 1048 buf ~ ret 거리 = 1048 + 4 = 1052 main + 69 부분으로 i와 ebp 까지의 거리를 구해보자. i ~ ebp 거리 = 12 i ~ ret 거리 = 12 + 4 = 16 따라서 buf ~ i 거리 = 105.. 이전 1 2 3 다음