System
-
[FTZ Level12 풀이]System/FTZ 2018. 2. 15. 23:49
[Level12 Code]1234567891011121314#include #include #include int main( void ){ char str[256]; setreuid( 3093, 3093 ); printf( "문자열을 입력하시오.\n" ); gets( str ); printf( "%s\n", str );} cs 해당 문제는 Level11과 비슷하지만, printf( )의 FSB 취약점이 사라졌고 gets( )함수로 입력을 받는다. 나는 이번 문제를 RTL을 이용해서 풀어봤다.RTL정리 : [이곳] #공격 시나리오1. EIP까지의 offset을 구한다. 2. System( )의 주소를 구한다. 3. /bin/sh문자열의 주소를 구한다. 4. RET공간에 System( )주소를 저장해서 Sy..
-
[FTZ Level11 풀이 ]System/FTZ 2018. 2. 15. 22:54
[Level11 Code]123456789101112#include #include int main( int argc, char *argv[] ){ char str[256]; setreuid( 3092, 3092 ); strcpy( str, argv[1] ); printf( str );} Colored by Color Scriptercs 여러가지 방법으로 풀 수 있지만, 나는 FSB를 이용해서 풀어봤다.pritnf( str ) 이 부분에서 FSB 취약점이 발생한다.자세한 정리는 [이곳]에 해두었으니, 자세한 설명은 생략하겠다. #공격 시나리오1. EGG Shell로 환경변수에 쉘코드를 올린다. 2. FSB공격으로 attackme파일의 DTOR_END(소멸자)공간에 환경변수 주소를 저장한다. 3. atta..
-
[Stack 7]System/Protostar 2018. 2. 10. 22:34
[Stack7 Code] [Stack7 실행]Stack6와 비슷한 코드지만, ret(EIP)가 0xb로 시작하면 예외처리에 걸리게 된다.따라서 0xb7로 시작하는 시스템함수로 변조하는 RTL공격은 불가능하다.그래서 이번에는 Chaining RTL공격으로 쉘을 따냈다. Chaining RTL공격은 ASLR이 걸려있지 않기때문에 가능하다.ASLR이 걸려있다면 ROP로 쉘을 따내야 할 것이다. [Chaining RTL]기본 개념은 RTL과 동일하다.우리가 RTL공격을 할 때 짠 페이로드를 한번 보자 #RTLPAYLOAD : python -c 'print "A"*68+"System( )"+"AAAA"+"/bin/sh" buf[64] SFP System( ) dummy"AAAA" /bin/sh여기서 dummy값이..
-
[Stack 6]System/Protostar 2018. 2. 10. 00:29
[Stack6 Code] [Stack6 실행]우선 프로그램을 실행하면 입력한 값을 그대로 출력해준다.gets( )에서 BOF취약점이 있으며, 이 점을 이용해서 RET를 변조할 수 있다.gets( ) 다음에 __builtin_return_address(0)함수로 리턴주소를 ret에 저장한다그 다음에 ret이 0xbf로 시작하면, 즉 스택와 동일한 주소면 종료하는 조건문이 있다.따라서 쉘코드로는 쉘을 따내지 못한다.그래서 RTL을 이용해서 쉘을 따냈다. [RTL]ReturnToLiblaryRET공간에 시스템 라이브러리 함수의 주소값을 넣어서함수가 끝나고 RET주소로 복귀할 때, 시스템 함수가 실행되도록 하는 것이다.자세한 설명 : [RTL이란?] 우선 RTL공격을 하려면 System라이브러리 주소와 /bin..
-
32Bit(x86)/64Bit(x64) 차이점 정리System/Reversing 2018. 2. 4. 02:56
[32Bit / 64Bit 차이점] 32Bit 64Bit 주소공간 2^32 만큼 사용가능 2^64만큼 사용가능 (실제로는 2^48) 레지스터 EAX,EBX,ECX,EDX,EBP,ESP,EDI,ESI (총 8개) RAX,RBX,RCX,RDX,RBP,RSP,RDI,RSI R8,R9,R10,R11,R12,R13,R14,R15 (총 16개) 함수 호출 규약 Cdecl / Stdcall Fastcall #64Bit에서 실제로는 48Bit만 사용 가능한 이유? 64Bit라면 64Bit만큼 주소 공간을 사용할 수 있어야 한다. 0xFFFF FFFF FFFF FFFF 총 16개Byte로 주소공간을 표현한다. 하지만, 64Bit를 전부 사용하게 되면 배보다 배꼽이 더 큰 상황이 생긴다. 2^64 만큼을 관리할 메모리 크..
-
[Stack 4]System/Protostar 2018. 2. 2. 23:44
[Stack 4 Code] [Stack 4 실행] 코드는 buffer를 입력받고 끝난다.BOF를 일으켜 win()를 실행시키면 되는 문제같다.우선, A를 65개 넣어봤지만 아무 반응이 없다.gdb로 열어봐야겠다. ========================================================== 문제를 풀기 위해선 EIP레지스터를 알아야 했다. EIP란Instruction Pointer로다음 실행될 함수의 주소값을 가지고 있는 레지스터다. 따라서, EIP공간까지 BOF를 일으켜서 win()의 시작 주소값을 넣어주면 되는 문제다. [Stack4 main] gets함수가 호출되는 부분에 BP를 걸고 실행을 시킨 후AAAA를 입력해봤다. 보면 buffer의 주소값이 0xbffff760임을..
-
[Stack 3]System/Protostar 2018. 2. 2. 20:42
[Stack 3 Code] [Stack 3 실행] 64바이트 버퍼공간을 입력받는다.그 후, 포인터fp안에 있는 주소값을 출력하고 그 주소값으로 fp함수를 호출한다.따라서, BOF로 우리가 원하는 주소의 함수를 호출할 수 있게된다.여기선 win함수를 호출하면 된다.그럼 code flow successfully changed 라는 문자열이 출력된다. =========================================================== 동작 모습은 확인 했으니 gdb로 main함수를 열어봤다.①에서 fp를 0으로 초기화 시켜준다.②에서 buffer를 입력받는다.③에서 fp가 0인지 아닌지 판별 후④ je(jump equal) 결과가 0과 같으면 ④-2로 jump하고다르면, ④-1로 계속 ..
-
[Stack 2]System/Protostar 2018. 2. 1. 20:53
[Stack 2 Code] [Stack 2 실행] getenv함수로 환경변수 GREENIE값을 불러온 후strcpy함수로 버퍼에 복사하는 과정에서 BOF가 발생한다. 환경변수 GREENIE를 만든 후, AAAA를 넣어주고 실행을 하면 modified값을 출력한다.BOF를 일으켜 modified변수에 0x0d0a0d0a를 넣어주면 Success 문구를 출력할 수 있다. ======================================================= 우선 버퍼공간이 64바이트니까 A를 64개 채워주고 스택상황을 확인해보자 저 부분이 strcpy함수를 호출하는 부분이니까그 다음 주소인 0x080484e4에 BP를 걸고 실행을 한다. ESP를 확인해보면 41(A)이 64개 채워진 다음 스택공..