일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- vtable
- C언어
- wrefresh
- .nret core 배포
- level trigger
- packet flow
- ioctl
- 취약점
- LOB
- Compiler
- doupdate
- NAPT
- REDIS
- iptables
- mvwin
- epoll_wait
- epoll
- DOCKER-USER
- edge trigger
- cbpf
- .net core 7
- architecture
- 어셈블리어
- BOF
- 풀이
- ncurses
- Docker
- wnourefresh
- rfc5508
- packet filter
- Today
- Total
목록Reversing (11)
Tuuna Computer Science
JMP명령어와 CALL명령어에 사용되는 오퍼랜드가 절대주소가 아닌 상대주소로 쓰인을 알게되었음. 구하는 방식은 현재 위치하는 주소를 뛰어갈 주소에서 뺀다음 JMP의 명령어 바이트만큼(5byte) 뺀다. 상대주소 = 뛰어갈 위치의 주소 - 현재 위치하는 절대주소 - 5 지금까지 어셈블리단에서 작성하면 어셈블러가 자동으로 변환해주었나 보다 ㅎ
IMAGE_IMPORT_DESCRIPTOR를 엄청나게 헷갈려했기에 정리하는 겸 배운만큼 써볼려함. 일단 IMAGE_IMPORT_DESCRIPTOR은 typedef struct _IMAGE_IMPORT_DESCRIPTOR { union { DWORD Characteristics; DWORD OriginalFirstThunk; // INT(Import Name Table) address (RVA) }; DWORD TimeDateStamp; DWORD ForwarderChain; DWORD Name; // library name string address (RVA) DWORD FirstThunk; // IAT(Import Address Table) address (RVA) } IMAGE_IMPORT_DESCR..
이는 윈도우 쓰레드를 이용해서 디버깅을 힘들게 해봤는데 그래도 쉬울 것이다. 함수를 잘 찾아보자
PE파일 포맷에 대해 다룰것이다. 필자가 공부한것을 정리하니 글이 이상할 수 있다. 일단 먼저 IMAGE_DOS_HEADER부터 보자. 여기서 볼건 Signature과 Offset to New EXE Header이다. signature은 윈도우의 PE스펙을 제작한 MZ를 나타내고 Offser to New EXE Header은 다음 헤더인 IMAGE_NT_HEADER가 파일크기상에서 어떤 위치에 자리잡는지 나타낸다. 이제부턴 IMAGE_NT_HEADER이다. IMAGE_NT_HEADER은 3개의 구조체로 나뉘는데 첫 번째는 Signature이다 이는 PE를 나타낸다. ㄴ 두 번째 구조체는 IMAGE_FILE_HEADER구조체이다. 좀 더 살펴 보겠다. 여기서 눈 여겨볼게 몇개 존재한다. 먼저 Machine..
PE 파일이 프로세스 가상 메모리에 로딩될 때 PE 헤더의 ImageBase 주소에 로딩된다. DLL파일의 경우 ImageBase에 이미 다른 DLL파일이 로딩되어 있다면 다른 비어 있는 주소 공간에 로딩된다. => 재배치 PE 재배치 작업의 기본 동작 원리 프로그램에서 하드코딩된 주소 위치를 찾는다. 값을 읽은 후 ImageBase만큼 뺀다. (VA -> RVA) 실제 로딩 주소를 더한다.(RVA -> VA) Relocation Table : 하드코딩 주소들의 OFFSET(위치)을 모아놓은 목록 PE 헤더의 Base Relocation Table 항목 따라가기 =================================== IMAGE_BASE_RELOCATION 구조체 VirtualAddress :: ..
[ UPack의 PE 헤더 분석 ] 1.헤더 겹쳐쓰기 :: MZ 헤더와 PE 헤더를 교묘하게 겹쳐쓰는 것. 정상적인 프로그램의 e_lfanew = MZ 헤더 크기(40) + DOS stub 크기(가변 : VC++의 경우 A0) = E0 BUT :: UPack에서는 10이다. -> UPack은 IMAGE_OPTIONAL_HEADER 148로 변경한다. ( COFF File Header -> SizeOfOptionalHeader ) e_lfanew : -> (e_lfanew 값이가리키는 자리에 NT header이 존재해야함) NT header의 옵셋을 표시(파일에 따라 가변적인 값을 가짐) 즉, 위의 말을 정리하자면 e_lfanew값이 가리키는 (VC++의 경우 E0)자리에 NT_HEADER이 있어야한다. ..
실행파일을 gdb로 바이너리 파일을 디버깅하고 디스어셈하면 각 함수 호출부분에 call 0x40fad0 와 call 0x4004a0 을 볼 수 있다. call 0x40fad0 이렇게만 적혀 있는 것은 정적링크로 컴파일 된 바이너리파일을 디스어셈하였을 때 볼 수 있는 현상이다. ( gcc -o (binary) (binary.c) -static : static옵션을 주면 정적링크로 컴파일 할 수 있다.) 그리고 call 0x4004a0 은 바이너리를 동적링크로 컴파일했을 때 볼 수 있는 현상이다. 지금부터 동적링크와 정적링크와의 차이점과 동적 링크결과 함수 뒤에 붙는 Plt, Got에 대해서 알아볼 것이다. 일단 정적링크와 동적링크에대해서 알아보기 위해서는 C 언어로 작성된 소스파일이 어떻게 컴파일과정을 거..
[Reversing.kr] Easy_ELF 비밀번호 찾기 (리버싱) reversing.kr에서 받을 수 있는 쉬운 문제인 Easy_ELF를 풀어볼 것이다. 먼저 이 실행파일을 IDA로 디버깅해보자 main함수부분에 cmp eax, 1를 발견할 수 있다. 이는 eax값이 1이냐 아니냐의 차이로 1이면 sub_80484f7주소로 틀리면 Wrong을 내보낸다. syb_80484f7주소로 들어가보자 Correct를 내보낸다. 이제 본격적으로 비밀번호를 찾아보자 일단 eax의 값을 1이냐 0이냐로 세팅해주는 sub_8048451주소로 들어가보자 그 주소로 들어가보면 많은 XOR과 CMP를 볼 수 있다 일단 CMP주로 보자 첫번째로 볼것은 byte_804A021메모리주소에 들어있는 값을 eax에 넣은 다음 cmp ..
[Reversing.kr ] Easy_Crackme! 비밀번호찾기(find password) Reversing.kr에서 받을 수 있는 초심 리버서 문제풀이용중 하나이다. 프로그램을 실행 시키면 일정값을 집어넣어야 하는 구간이 생긴다. 만일 값이 틀린다면 Inccorrect Password 라는 문구가 뜨게된다. 이제 본격적으로 이 프로그램의 비밀번호를 찾아보자! Ollydbg로 바이너리를 분석해본다. (IDA Pro는 그래프를보여주기때문에 매우 편리하다....) (하지만 아직 익숙하지 않으므로 패스...) 일단 먼저 serchfor string해서 문자열을 찾아보자 cingratulation이 보인다. 이 문자열이 있는 주소로 이동해보장 일단 cmp분기점이 있는 구간을 위주로 보기 쉽게 브리이크를 걸어보..
abex ' 2nd crackme:1 (시리얼 값 찾기) 윈도우 리버싱연습으로써 abex' 2nd crackme의 시리얼값을 알아보도록하자 일단 먼저 프로그램을 실행해보자. name값을 치는 공간과 serial값을 치는 구간이 있다. 틀린 값을 넣으면 틀렸다고 나온다. 메세지가 Worng serial이라고 나오는것을 보아 name값에 따라 serial값이 바뀐다는것을 어느정도 유추할 수 있을것이다. ( 물론 필자는 예측 실패) 이 파일을 Ollydbg로 까보자. 그럼 00401238주소에 EP가 형성된다. (entry point) 0040123D주소에 MSVBVM60를 호출하는 것을 발견할 수 있다. 이는 visual basic로 작성된것을 확인할 수 있다. 이 함수로 들어갈 필요는 없는데 만약 들어가면..