1. 코드 읽기

:3
setup 함수는 stdin, stdout, stderr을 초기화시켜주는 함수이다.
:12
setup 함수를 실행한다.
:14
buf라는 0x100 크기의 변수를 선언한다.
:16
"What's your name? : " 을 출력한다.
:17
gets() 함수로 buf에 입력을 받는다.
:19,20,21
"Hello, (buf 안에 있는 값) !!!" 을 출력한다.
:23
"Last greeting : " 을 출력한다.
:24
gets() 함수로 buf에 입력을 받는다.
[exploit 코드 만들기]

:3
"What's your name?: " 까지의 문자열을 가져온다.
:7
"AAAAA ... AA\n"
여기서 개행은 어디로 사라질까?
-> gets함수에서 null문자로 바꿔준다. (tmi라고 하셨다.)
2. 계산하기
1) buf, sfp, ret
buf는 0x100의 버퍼값을 가지고 있다.
sfp는 Stack Frame Pointer를 말한다.
ret는 Return Address로 함수가 종료되면 다음 실행할 곳의 주소를 말한다.
sfp와 ret은 64bit 안에서 돌아가기 때문에 8bit 레지스터이다.
그래서 버퍼는 0x100 + 0x8 + 0x8 ( buf + sfp + ret ) 구조이다.
2) buf의 시작 주소

disassemble main을 쳐서 main 부분을 들여다 봤다.
breakpoint를 걸어서 버퍼의 시작 주소를 알아봐야겠다.
breakpoint는 0x00000000004006ee <+70> call에 걸 것이다.

첫번째 buf값을 입력받은 후에

이렇게 브레이크포인트에 바로 걸린다.
다음 buf값을 입력받을 때까지 계속 ni를 눌러보자.


hellohello를 입력해주었다.

hellohello가 0x7fffffffde90에 들어가는구나!
잘못하고 꺼버려서 다시 입력했다.

0x400724 <main+124> 에 breakpoint를 걸어봐야겠다.

아까 (다시) 입력한 asdf가 0x66647361에 들어가는 걸 볼 수 있다.

최종 exploit 코드이다.
:3
test라는 파일을 불러온다.
:4
test라는 파일에 어떤 보호 기법이 있는지 보여준다.
:6
새로운 터미널 창을 띄어준다.
:8
"What's your name?:" 까지의 문자열을 가져온다.
:9
""에 입력받는다.
:13
payload를 null로 초기화한다.
:14
payload에 쉘코드를 넣는다.
:16
payload에 0x108만큼 A를 써준 다음에 버퍼 시작 주소를 넣는다.
:19
사용자와 상호작용을 하기 위해서 쓰는 명령어이다.
'Sunrin > Layer7' 카테고리의 다른 글
NX-bit binary exploit ( with ASLR ) (0) | 2020.08.27 |
---|---|
NX-bit binary exploit (0) | 2020.08.25 |
Webhacking Project - PHP와 MySQL (0) | 2020.08.12 |
Dreamhack - Introduction of Webhacking 정리 (0) | 2020.08.07 |
Stack Frame (0) | 2020.07.10 |