stack
-
x64 BOF(Buffer Overflow)System hacking training/Knowledge 2018. 4. 18. 20:32
오늘은 x64 즉 64 bit 환경에서의 buffer overflow에 대해 포스팅하겠습니다. 먼저 x86 vs x64에 대해 선행 지식이 필요합니다. 바이너리 하나를 받았는데 이제서야 풀이해보네요.ㅠ 먼저 바이너리를 확인해보겠습니다. char buffer가 256 byte로 할당되었지만 gets()의 사용으로 인해 bof가 터집니다. gets()는 NULL문자가 오기전까지 모든 문자열을 입력받는데 바로 여기서 ret 를 침범하여 우리가 원하는 shell()를 실행할 수 있습니다. 이전의 x86 bof 문제에서 처럼 payload를 구성해보면 [x86 payload] python -c 'print "A"*256+"SFP(4)"+"ret(4)"' 이렇게 buf 를 의미없는 문자로 덮어주고 SFP를 4byt..
-
Stack6 풀이System hacking training/Protostar 2018. 2. 16. 21:20
[문제] 문제를 보면 쉘코드를 올려서 문제를 풀 수 없도록 되어있네염 0xbf로 시작하는 모든 주소는 예외처리에 걸리기 때문이지요~ㅎ 하지만 취약점은 존재합니다. 역시나 gets()를 사용하였기 때문에 bof 취약점이 존재하는데요. 쉘코드를 쓸 수 없지만 쉘을 띄우기 위해서는 RTL이라는 기법을 쓸 필요가 있겠네요~ 보면 메인은 별게 없고, getpath()를 보면 총 스택공간을 0x68 (dec : 104) 만큼 할당하고 ebp-76이 buf의 시작주소임을 알 수 있습니당 그렇다면 SFP까지 총 80 byte 더미값을 채우고 system()를 return address로 덮고, 인자값을 주기 위해 더미 4 byte 채운뒤 /bin/sh이 위치한 주소를 적어주면 system("/bin/sh")가 실행되어..
-
Stack4 풀이System hacking training/Protostar 2018. 2. 4. 20:59
[문제] 이전문제와는 다르게 함수 포인터가 없다. 하지만 여전히 gets() 사용으로 인해 bof 취약점이 존재한다. ret 을 win()의 주소로 변조시키면 win()가 실행될것이다. [풀이] gdb로 열어보면 main()에서 80바이트의 공간을 할당한 것을 알 수 있다. 따라서 SFP와 buffer[64] 사이의 dummy가 들어가는지 체크할 필요가 있다. 예상한 스택 구조는 이러하다. | char buffer[64] | dummy | SFP | RET | 따라서 buffer와 dummy, sfp를 A로 모두 덮고 마지막에 win()의 주소를 넣어줬다.
-
Stack3 풀이System hacking training/Protostar 2018. 2. 4. 16:13
[문제] win()를 실행시키면 된다. 이 프로그램 역시 gets()의 사용으로 bof 취약점이 존재하고 이 취약점을 이용하여 함수 포인터 fp에 win()의 주소를 넣어주면 된다. [풀이] dummy값 확인을 위해 gdb로 열어본다. win()의 주소도 함께 알아보았다. 이 프로그램 역시 페이로드에 참고해야할 dummy값이 없다. 즉, 함수 포인터 fp와 char buffer[64]가 붙어있다는 뜻이다. 따라서 gets()의 bof 취약점을 이용하여 64 바이트 A를 넣어주고, 위에서 구한 win()의 주소를 구하면 성공한다. 주소가 정확히 win()의 주소로 변경이 되었음을 확인할 수 있다.
-
Stack2 풀이System hacking training/Protostar 2018. 2. 4. 15:49
[문제] 문제를 보면 variable에 getenv()를 이용하여 환경변수의 값을 넣어주는것을 볼 수 있다. 그리고 취약점은 역시 strcpy() ! 문자열의 길이를 검사하지 않기 때문에 bof 취약점이 존재한다. 풀이를 위해 buffer[64] 와 modified 사이의 offset을 구해야한다. 이는 gcc 컴파일 과정에서 들어가는 쓰레기값 즉, dummy 값이 존재하는지 확인을 하기 위함이다. [풀이] 먼저 gdb로 열어본다. dummy 값만 체크를 해보자. 아 여기서 dummy 값은 문제 풀이를 위해 modified 와 buffer[64] 사이만 확인을 했다. 결과는 이전 문제와 동일하게 없었다. 따라서 이 프로그램의 스택 구조를 확인해보면 이러하다. | char *variable(esp) | d..
-
Stack1 풀이System hacking training/Protostar 2018. 2. 3. 21:00
[문제] [풀이] 역시 stack0와 같이 modified 의 값을 변경해야 하는 문제인데 다른점은 if 문 참 조건이 modified 의 값이 0x61626364 이다. 또 다른점은 이 문제의 취약점은 strcpy()에 의해 bof가 발생한다는 점이다. strcpy()는 문자열의 길이를 검사하지 않는다. 정확한 계산을 위해 gdb로 열어본다. 소스 코드가 주어졌기 때문에 분석은 어렵지가 않다. 역시 esp+0x5c 가 modified esp+0x1c 가 buffer 시작 위치다. [Stack] [low address] | char buffer[64] | int modified | SFP | RET | [high address] 이전 문제와 동일하다. 따라서 페이로드를 (python -c 'print "..
-
Stack0 풀이System hacking training/Protostar 2018. 2. 3. 20:24
[문제] [풀이] main()안의 변수를 보면 int형 변수 modified와 char 64크기의 배열 buffer가 존재한다. modified의 값을 바꿀 수 있는가를 시험하는 문제인것같다. 여기서 bof 취약점을 발견할 수 있었는데 gets()는 경계를 검사하지 않는 함수가 쓰였기 때문에 bof 공격이 가능하다. bof 취약점을 이용하여 modified의 값을 바꿔주면 된다. [Stack] [low address] | char buffer[64] | int modified | SFP | RET | [high address] buffer와 modified 중간에 더미값이 없는 쉬운 문제다.(5c(hex) - lc(hex) == 64(dec)) esp+5c 에 0을 넣는것으로 modified의 위치를 알..