본문 바로가기

writeup/JFF 시즌 3

yamyam (explanation, code)

서버에 netcat으로 TCP연결을 하면 x64면서 인텔 문법으로 되어있는 어셈블리를 줍니다.

그 다음 RAX값이 뭐냐고 물어봅니다. 그 명령들을 실행한 후의 RAX값을 물어보고 있죠.

그냥 앞 뒤에 적당한 코드를 붙인 후 직접 컴파일하고 실행하도록 했습니다.


아 참, 그리고 요청이 이렇게 와요. (stage)

Eunji Say: yam yam

STAGE 1

mov    QWORD PTR [rbp-0x8],0x306

mov    DWORD PTR [rbp-0x14],0x372

mov    DWORD PTR [rbp-0x10],0x317

mov    DWORD PTR [rbp-0xc],0x10d

mov    eax,DWORD PTR [rbp-0x14]

imul   edx,eax,0x79

mov    eax,DWORD PTR [rbp-0x10]

imul   eax,DWORD PTR [rbp-0xc]

add    eax,edx

sub    eax,0x4c

mov    eax,eax

mov    QWORD PTR [rbp-0x8],rax

mov    rax,QWORD PTR [rbp-0x8]

What is the value of RAX?(unsigned decimal number)


요렇게 오는데 rsp가 아니라 rbp를 참조하더라구요.
rbp는 기본적으로 엔트리포인트에서는 0으로 초기화가 될거에요. rsp는 스택 위치를 가리킬거구요.
저는 main함수로 돌렸기 때문에 상관 없지만..
그리고 함수 내에서 rbp를 rsp로 설정하고 들어가지 않는 이상 보통 그 함수를 호출한 함수의 스택 맨 윗부분을 가리키기 때문에, 앞에 코드를 붙일 때 push rbp; mov rbp, rsp; 이렇게 rbp를 rsp로 옮겨줬어요. push rbp는 딱히 할 필요는 없지만 그냥 했어요.
그 다음 printf에다가 넘겨줬죠!

아래는 코드에요.


'writeup > JFF 시즌 3' 카테고리의 다른 글

yamyam (explanation, code)  (1) 2015.07.28
complex_comment (exploit only)  (0) 2015.07.28
simple_comment (exploit only)  (0) 2015.07.28
vaja (exploit only)  (1) 2015.07.28