분류 전체보기

Reversing Advanced

[dreamhack] rev-basic-2

rev-basic-2sub_140001000()를 보자.__int64 __fastcall sub_140001000(__int64 a1){ int i; // [rsp+0h] [rbp-18h] for ( i = 0; (unsigned __int64)i for문으로 a[i]를 1자리씩 가져와서 aC[4*i]와 비교한다.즉, aC[4*i]가 flag다..data:0000000140003000 _data segment para public 'DATA' use64.data:0000000140003000 assume cs:_data.data:0000000140003000 ;org 140003000h.data:0000000140003000 ..

Reversing Advanced

[dreamhack] rev-basic-1

rev-basic-1int __cdecl main(int argc, const char **argv, const char **envp){ char v4[256]; // [rsp+20h] [rbp-118h] BYREF memset(v4, 0, sizeof(v4)); printf("Input : "); sub_140001440("%256s", v4); if ( (unsigned int)sub_140001000(v4) ) puts("Correct"); else puts("Wrong"); return 0;}sub_140001000(v4)가 TRUE면 "Correct"를 출력한다. sub_140001000()를 분석해보자._BOOL8 __fastcall sub_140001000(_BYTE ..

Reversing Advanced

[dreamhack] rev-basic-0

rev-basic-0ida64로 chall0.exe를 디컴파일 했다.ida64 → open → chall0.exe → main → [tab] click main()을 hex-ray(TAB)로 디컴파일해서 코드를 확인해보자.int __cdecl main(int argc, const char **argv, const char **envp){ char v4[256]; // [rsp+20h] [rbp-118h] BYREF memset(v4, 0, sizeof(v4)); printf("Input : "); sub_1400011F0("%256s", v4); if ( (unsigned int)sub_140001000(v4) ) puts("Correct"); else puts("Wrong"); ..

System Hacking Advanced

[dreamhack] cpp_smart_pointer_1

개념정리○ smart pointer스마트 포인터(Smart Pointer)는 메모리 누수(Memory Leak)를 방지하기 위해 사용되는 C++의 기능 중 하나다. 동적 할당된 메모리를 가리키는 포인터가 더 이상 필요하지 않을 때, 해당 메모리를 자동으로 해제하는 포인터를 말한다. 스마트 포인터는 일반적으로 std::shared_ptr, std::unique_ptr, std::weak_ptr 등의 클래스로 구현된다. 이러한 스마트 포인터들은 더 이상 사용되지 않는 동적 할당된 메모리를 추적하고, 해당 메모리를 자동으로 해제하여 메모리 누수를 방지한다. ○ smart pointer Typestd::shared_ptr은 여러 포인터가 하나의 메모리를 가리킬 때 사용되며, 참조 카운트(Reference Cou..

System Hacking Advanced

[dreamhack] cpp_container_1

개념정리container overflow와 관련된 문제를 다룬다. C++에서는 std::memcpy, std::memmove, std::memset , std::copy 와 같이 메모리를 복사하는 함수들이 사용된다. 해당 함수들을 사용하는 경우에는 주의할 점이 있는데, 길이에 대한 검증이다. 만약, 복사 과정에서 길이에 대한 검증이 존재하지 않다면, 쉽게 overflow가 발생할 수 있다. void f(const std::vector &src) { std::vector dest(5); std::copy(src.begin(), src.end(), dest.begin());}특히, container는 기본적으로 heap 영역에 데이터가 생성되고 std::copy 를 이용해서 cont..

System Hacking Advanced

[dreamhack] cpp_type_confusion

개념정리type confusion은 프로그램에서 사용하는 변수나 객체를 선언/초기화했을 때와 다른 타입으로 사용할 때 발생하는 취약점이다. C와 C++로 만들어진 프로그램에 Type Confusion 취약점이 존재한다면 메모리 커럽션이 유발되어 공격자가 시스템을 장악하는 것이 가능하다. 이러한 취약점은 형 변환(Type Casting)과정에서 발생한다. cast는 변수, 객체의 형태를 기존과 다른 타입의 형태로 바꾸는 것을 말한다. C++에서 객체의 형태를 변환할 때 사용되는 연산자는 다음과 같다. ○ 연산자 종류dynamic_cast런타임에 타입을 체크하여 다운캐스팅을 수행하는 연산자다. 다운캐스팅 시 안전한 형변환이 가능한 경우에만 캐스팅을 수행하며, 안전하지 않은 경우에는 NULL 포인터를 반환한다..

keyme
'분류 전체보기' 카테고리의 글 목록 (5 Page)