DreamHack

System Hacking Advanced

[dreamhack] house_of_spirit

개념정리House of Spirit은 fastbin을 공격하는 기법으로, 같은 크기만큼 재할당 하는 경우에는 같은 주소를 반환하는 fastbin 특성을 이용한다. free() 함수의 인자를 조작해서 임의 메모리를 해제할 수 있을 때 사용할 수 있는 기법이다. 정확히는 스택/힙에 fake chunk size를 쓰고 해당 주소에서 0x8을 더한 주소를 free 할 수 있는 경우에 발생한다. ○ House of force와의 차이점House of force은 실제 Top chunk size를 조작하는 공격 기법이지만, House of Spirit은 Top chunk size를 변경할 수 없는 경우에 fake chunk를 구성해서 공격하는 기법이라는 차이점이 있다. 예를 들어보자. 다음과 같이 스택에 prev_..

System Hacking Advanced

[dreamhack] house_of_force

개념정리House of Force 기법은 top chunk의 size를 조작하여, 임의 주소에 힙 청크를 할당할 수 있는 공격 기법이다. top chunk는 기본적으로 다음 할당을 위한 주소를 저장하는 역할을 한다고 이해하면 된다. 따라서 top chunk의 size를 조작한다면 다음에 할당할 주소를 조작하는 것과 같기 때문에 임의 주소에 쓰기가 가능한 것이다. House of Force는 공격자가 top chunk의 size를 조작하고, 원하는 크기의 힙 청크를 할당할 수 있을 때 활용 할 수 있다. ○ _ini_mallocstatic void *_int_malloc (mstate av, size_t bytes){ INTERNAL_SIZE_T nb; /* normalized ..

Reversing Advanced

[dreamhack] rev-basic-9

_BOOL8 __fastcall sub_140001000(const char *buf){ int i; // [rsp+20h] [rbp-18h] int len; // [rsp+24h] [rbp-14h] len = strlen(buf); if ( (len + 1) % 8 ) return 0i64; for ( i = 0; i buf 길이가 8의 배수여야 한다.buf를 8자리씩 sub_1400010A0()로 검증한다.sub_1400010A0()이 실행된 후, buf[i] == &unk_140004000 조건이 충족해야 한다.sub_1400010A0() 가 실행된 후의 buf가 [그림]의 데이터와 일치하면 된다. 다음으로 sub_1400010A0()를 분석해보자.__int64 __fastcall s..

Reversing Advanced

[dreamhack] rev-basic-8

__int64 __fastcall sub_140001000(__int64 a1){ int i; // [rsp+0h] [rbp-18h] for ( i = 0; (unsigned __int64)i a1[i] * -5 == byte_140003000[i] 을 만족하는 a1[i] 를 구하는 문제다. 단순한 방법은 a1[i] == byte_140003000[i] / -5 를 연산해서 a1[i]를 구하는 것이다. 그러나 단순하게 생각해서 구현하면 a1[i] 을 구할 수 없다.이유는 if문을 보면 a1[i] * -5 연산 후에 (unsigned __int8)로 형변환을 수행하기 때문이다.즉, 형변환까지 고려해서 a1[i]을 구해야한다. 역연산으로 byte_140003000[i]부터 a1[i]를 구하려고 여러가지 ..

Reversing Advanced

[dreamhack] rev-basic-7

__int64 __fastcall sub_140001000(__int64 a1){ int i; // [rsp+0h] [rbp-18h] for ( i = 0; (unsigned __int64)i a1[i]과 (i&7)을 ROL 연산ROL 연산 결과를 i와 xor 연산결과를 byte_140003000[i]와 비교 핵심으로 알아야 하는 키워드는 ROL 연산이다. ○ ROL쉽게 설명하면 left shift 연산이랑 비슷한데, 연산 수행 후에 기존 8자리를 벗어나게 되는 비트는 오른쪽 맨 끝 자리로 돌아오는 형태의 연산이다.shitf 연산인데 큐처럼 동작하는 shift 연산이라고 비유하면 될 것 같다. XOR 연산의 경우는 양변을 i로 XOR 연산해주면 되기 때문에 쉽게 해결할 수 있다. XOR 연산을 수행하..

Reversing Advanced

[dreamhack] rev-basic-6

__int64 __fastcall sub_140001000(__int64 a1){ int i; // [rsp+0h] [rbp-18h] for ( i = 0; (unsigned __int64)i if문을 보면 byte_140003020[] 과 byte_140003000[] 를 비교하는 것을 확인할 수 있다.byte_140003020[a1[i]] == byte_140003000[i] 조건을 만족해야한다. 요약하면 다음과 같이 설명할 수 있다.byte_140003020[] 중에서 byte_140003000[i]와 같은 값에 대한 인덱스를 구하고 a1[i]로 넣어주면 flag다. 인덱스 값을 맞춰주기 위해서 byte_140003020[] 과 byte_140003000[] 의 데이터를 확인했다. .data:0..

keyme
'DreamHack' 태그의 글 목록