Reversing&Write up 9

[LeagueOfGuardians 2] EnteredFLAG

[LeagueOfGuardians 2] EnteredFLAG 64bit 바이너리입니다. 입력을 받고 아무 출력을 하지 않고 꺼집니다. 사실 이 문제는 팀원들이 “angr 문제다”라고 하자마자 잡은 문제입니다. 어제 이 대회를 준비하면서 angr를 설치하다가 계속 오류가 나서 애를 썼는데, 문제가 나왔으니 일단 도전은 해보자 해서 풀게 되었습니다. 이렇게 한 문자씩 가르쳐주는 함수들이 있고, 이 모든 걸 우회하면 플래그가 나올 것입니다. . . . 바로 저 부분이 플래그를 출력해주는 부분인데요. 주소를 확인해봅시다. 0x400DEF네요. 바로 파이썬 코드를 작성해보겠습니다.

[HandRay] while문, for문 패턴, WinMain API?

while:#include int main(){ int i = 0;while(i < 10){printf(“Hello\n”);i++;} return 0; } 원하는 곳 초기화비교문과 jmp종속 명령과 증감식jmp mov 명령으로 int i = 0; 실행. (어셈블리 1번) cmp로 비교하고 JGE로 i < 10이 거짓일 때, while을 빠져나감. (어셈블리 2번) 참일 때, printf(“Hello\n”);를 실행하고 i값을 증가시킴. (어셈블리 3번) 종속 명령이 다 끝나고 나면 cmp부분으로 jmp함. (어셈블리 4번) for: #include int main(){int i; for(i = 0; i < 10; i++){printf(“Hello\n”);}return 0;} 초기화jmp증감식비교문과 jm..

[HandRay] 함수 호출 패턴, 구조체 패턴, 코드 패치

함수 호출 패턴 함수를 호출하는 쪽 : Caller호출되는 함수 : Callee 인자의 개수, 인자의 타입, 리턴 값을 보면 어떤 함수인지 찾기 쉬움. CALL 명령은 돌아가야할 주소를 stack에 push하고 함수로 jmp한다.__cdecl 함수 프롤로그PUSH EBP- 이전 EBP의 위치 기억MOV EBP, ESP- EBP를 ESP으로 옮김SUB ESP, 0C- 지역 변수의 크기 할당 함수 에필로그MOV ESP, EBP- ESP를 EBP로 옮김POP EBP- 기억했던 이전 위치를 다시 EBP로 옮김RETN- 돌아가야할 주소로 jmp 구조체 패턴 멤버들이 연속적으로 할당됨. 코드 패치 어셈블리어 영역, Data 영역을 변조하는 것이 가능하다.Code 영역 변경하는 방법어셈블리 영역을 클릭하고 space..

[HandRay] Main 함수 parameter, pointer 패턴

Main Func Argumentsint argc, char *argv[], char *envp[] argc - main 함수에 전달되는 인자의 개수argv - 넣은 문자열의 포인터 배열envp - 환경 변수 보통 3개의 인자를 넣고 호출하면 main 함수라는 것을 유추할 수 있음. 실행하면 이런 결과가 출력. OllyDBG에서 main 함수 인자를 전달하려면 Debug -> Arguments에 갑 입력. Pointer Compiled code Pattern LEA : Source Operand의 주솟값을 Destination에 저장하라는 의미.포인터 변수를 사용할 때 주로 사용되는 Assembly 명령어임.레지스터에 대괄호가 쳐져 있으면 주소를 간접 참조한 값을 의미함. AND : 두 개의 Operan..

[HandRay] OllyDbg 사용법과 Data Expression

Window XP를 쓰는 이유 : ASLR이 없기 때문임. Assembly : 기계어와 1대 1 대응. 프로그래밍 언어 중 가장 기계어와 가까움 (저급 언어) OllyDbgcode 영역 : 코드가 기계어와 어셈블리 명령으로 보임.Register 영역 : Register를 볼 수 있음.Dump 영역 : 메모리를 볼 수 있음.Stack 영역 : 현재 Stack 메모리의 값을 확인할 수 있음. ;(세미콜론) : 주석을 달 수 있음.F8 : Step Over 한 줄씩 내려가지만 함수를 다 돌리고 넘어감..F7 : Step Into 한 줄씩 내려가지만 함수 안으로 진입함.원하는 위치 클릭 + F4 : 원하는 위치로 한 번에 이동.F2 : Break Point 설정 / 해제.F9 : 쭉 실행하다가 Break Poi..

[HandRay] 핸드레이와 레지스터

프로그램의 제작 원리.c -> [compile] -> .obj -> [link] -> .exe 디컴파일 : .exe -> .c 실행 파일을 디버거로 돌려서 소스코드로 복원하는 것.핸드레이 : 디컴파일을 손으로 하는 것. ALU. 연산 장치. 전기적인 신호를 흘려보내서 연산을 진행하는 회로.I/O Unit. 모니터, 키보드 등 외부적인 부분과 통신을 위한 회로. 회로를 버스라고 부름.Register. CPU의 임시 변수. 매우 빠름.Control Unit. 현재 PC 상태, 다음에 어떤 연산을 해야할지. 연산의 결과를 알 수 있음. General Purpose Register (범용 레지스터) : 고루고루 쓰이는 레지스터.EAX : 연산의 결과를 저장, AX (16bit), AH(8bit), AL(8bit..

[제 1회 Root CTF] EGG - (863 point)

ltrace로 열어서 아무 문자열이나 넣어주면, 어떤 값과 xor해서 저 문자열이랑 비교합니다. 저 문자열을 복붙해서 다시 넣으면, flag가 나옵니다. ltrace는 leviathan 문제를 겨우 분석해서 풀었는데, ltrace를 쓰면 바로 풀리는 걸 보고 얼마 전에 배웠습니다. 그 덕에 간단하게 풀 수 있었던 것 같습니다. 확인 차 넣어주면 알이 부화합니다. FLAG{An1v1a_3GGniViA_3Ni6mA}

[제 1회 Root CTF] Stage Game - (229 point)

level 1 ~ 10 시간을 늘려가면서 Sleep을 때립니다. 여기가 Y/N 받는 부분인데 밑에 일정하게 함수가 있는 걸 보니 Stage인 것 같습니다. Y를 1로 받기 때문에 1을 넣으면 밑에 Stage 함수로 갈 수 있습니다. Sleep 함수를 호출합니다. 그 전에 인자를 넣어주는데 그게 얼만큼 오래 Sleep하는지 결정하는 인자이기 때문에, 그걸 0으로 바꿔주면 바로 넘어갈 수 있습니다. 이 값을, 0으로 바꿔주면 넘어갑니다. Stage2도 마찬가지로, 0으로 바꿔주면 넘어갑니다. 8번만 더하면 됩니다.함수 밑에 바로바로 연결되어 있어서 BP 걸고 F9하면 금방 풀립니다. (F7 F8 실수 계속해서 푸는데 30분 걸렸다… 알고도 당하는 Stage..) FLAG{Y0ur_p4t1enc3_1s_gr3..

반응형