본문 바로가기

WARGAME/exploit-exercise

[exploit-exercise] fusion level02

이번 문제는 ASLR, NX-bit 보호기법이 걸려있습니다. 


전체적인 동작은 encrypt_file() 함수에서 사용자에게 사이즈와 해당 사이즈만큼의 스트링을 입력받고, 이를 cipher() 함수에서 암호화하여 다시 전달해주는 방식입니다.


bof가 일어나는 부분은 encrypt_file() 함수에 있습니다. buffer 변수는 사이즈가 고정되어 있는 반면 입력받는 크기를 결정하는 sz 변수는 사용자가 마음대로 설정할 수 있기 때문에 이 부분은 아주 쉽게 bof를 일으킬 수 있습니다.


문제는, eip가 덮힐 때의 스트링은 랜덤값과 한바이트씩 xor된 상태이기 때문에 정상적인 공격 페이로드를 입력했더라도 cipher()함수에 한 번 들어갔다 나오면 단순 스트림암호화가 되어있게 됩니다.


그렇지만, xor 같은 경우는 아래와 같은 특성을 갖기 때문에 나머지 하나를 알 수 있게됩니다.


A ^ B = C

A ^ (A ^ B) = C ^ A = B


만약, 문자 'A'(0x41)를 입력했을 때, cipher()함수를 거치고 출력 된 문자 값이 'C'(0x42)라면 keybuf[0] = 0x02 임을 알 수 있습니다. 또한, 이 keybuf는 최초에 한 번 랜덤 값을 입력받고 이후에는 같은 값으로 계속 스트림암호화를 하게 됩니다.


따라서, 아래 exploit 코드에서는 round1() 함수에서 128바이트의 keybuf를 알아내고, round2() 함수에서는 공격 페이로드를 미리 알아낸 keybuf와 xor해서 서버에 전송합니다.


이렇게 되면, cipher()에 들어간 스트링이 다시 한 번 고정된 keybuf와 xor 연산을 하므로 정상적인 공격 페이로드가 스택에 들어가게 됩니다.



'WARGAME > exploit-exercise' 카테고리의 다른 글

[exploit-exercise] fusion level03  (0) 2015.12.22
[exploit-exercise] fusion level01  (0) 2015.12.22
[exploit-exercise] fusion level00  (0) 2015.12.22