1 minute read

결과 화면

Image





진행 과정

Image

gdb를 켜고 bomb파일을 run했다.

<+0> stack pointer(%rsp)를 8byte감소시켜 stack에 공간을 확보

<+4> intsruction pointer(%rip)를 기준으로 0x182d만큼 떨어진 메모리 주소(0x555555402b2c)를 %rsi 레지스터에 load함.

<+11> strings_not_equal 함수가 호출되고 있음. 함수 이름으로 이번 phase_1의 암호는 문자열임을 유추할 수 있음. 이 함수를 disassemble 해보자.

Image

<+0> ~ <+3> %r12, %rbp, %rbx레지스터를 스택에 저장한다.

<+4> %rdi를 %rbx에 저장한다. 생각해보니 이렇게 인자를 전달하려면 어디선가 호출이 일어났을 텐데, 대충 훑어봤는데 그런 부분이 보이지 않는다. 지금이라도 main함수를 disassemble해봤다. 하단에 관련 코드를 첨부한다. 이 코드의 %rdi는 <+83>에서 받은 %rdi이다.

Image

<+7> 다시 strings_not_equal 함수로 돌아오자. %rsi를 %rbp에 저장한다. 이는 문제의 답이 될 문자열을 담고 있다.

<+10> ~ <+15> 첫 번째 문자열의 길이를 계산하는 듯한 string_length함수를 호출한다. 이 결과는 %eax에 저장된다. 이를 또 %r12d 레지스터에 저장한다. 코드를 구경해보자.


Image

null 문자($0x0과 비교)를 발견할 때까지 %rdx가 가리키는 byte를 읽어와서 확인 후 %eax에 저장된 문자열의 길이값을 반환하는 함수이다.

<+18> ~ <+26> 다시 strings_not_equal 함수로 돌아오자. string_length에서 반환된 %rbp에 저장된 정답 문자열 길이를 계산하고 %edx에 immediate value 1을 저장한다. 문자열 비교하여 다른 경우 이 값(1)을 반환하지 않을까?

<+31> ~ <+34> %eax(정답 문자열)과 %r12d(입력 문자열)을 비교한다. 길이가 같을 경우 0x55555540181c <strings_not_equal+43>로 점프한다.

<+43> movezbl은 메모리에서 1byte를 읽어와 32bit register에 저장한다. %rbx가 가리키는 메모리 주소에서 1byte를 읽어와 %eax에 저장한다. %eax에는 문자열의 한 문자가 저장된다.

<+46> test instruction은 두 register 값을 AND연산한 결과가 0인지 아닌지 판단하고 이에 따라 CPU의 Zero flag를 설정한다. 가져온 문자가 null(0x00)인지 확인하여 문자열의 끝에 도달했는지 확인하려는 것. %al값끼리 비교해서 둘 다 0이라면 zero flag가 설정될 것이다.

<+48> je instruction은 zero flag가 설정되어 있을 때 명시된 주소로 점프한다. 설마 빈 문자열이 정답이겠어 생각하고, 0x55555540184a <strings_not_equal+89>로 점프하지 않고 일단 코드를 더 읽었다.

<+53> ~ <+101> 문자열 비교 loop. 문자열의 각 값을 하나씩 비교. 루프를 통해 포인터를 증가시키며 문자열 두 개를 비교하다가 문자열의 끝을 만나면(null 문자) %edx에 0을 저장하고 <+36>으로 점프해서 스택들을 pop하고 0을 반환한다. 역시 strings_not_equal은 입력한 두 문자열이 같은지 확인하는 함수였다.


<+16> 다시 phase_1 함수로 돌아오자. %eax 레지스터에 return값이 저장됐을 것. 만약 같은 문자열을 입력했다면 <+18>의 explosion을 향한 유혹에 걸리지 않고 <+18>~<+24>를 실행하여 retq에 도달할 것이다. 어느정도 함수 파악이 끝난 것 같으니 이제 정답이 있을 것만 같은 메모리 0x555555402b2c 주소의 값을 확인해보자.

Image

public speaking이 그닥 쉽지는 않아보이지만, 이 문자열을 정답으로 입력하니 첫 번째 폭탄을 해체할 수 있었다.





정답

Public speaking is very easy.



Leave a comment