1. 보호기법 확인
2. 과정
read로 buf변수에 입력받은 후 buf변수 값을 출력할 때 그냥 printf(&buf)로 출력해서 FSB(format string bug) 취약점이 존재한다.
1) %n 서식자 사용한 방법
1)-1. 0x000000da => 0x0 0x0 0x0 0xda
입력한 AAAA가 8번째에서 출력된다.
길이를 8자리로 맞추기 위해 2번째 ~ 6번째까지는 %08x 5개를 출력하고,
7번째에는 0xda 10진수(218) - (처음 magic 주소 길이 + %08x 5개 길이 = 44) = 174, 즉 %174c를 주고,
ㅡmagic 주소가 위치한 곳에 %n을 출력해서 magic addr에 0xda의 값으로 덮히도록 한다.
1)-2. 0xfaceb00c => 0xb00c 0xface
0xfaceb00c의 경우, magic addr에 덮을 때 2바이트씩 나눠서, 0xface와 0xb00c로 나눠서 덮는다.
주소는 little endian으로 써지므로 magic_addr에 0xb00c를, magic_addr+2에는 0xface를 쓴다.
0xb00c 10진수 : 45068
0xface 10진수 : 64206
처음에 줄 때 magic_addr AAAA magic_addr+2 를 줘야하는데, 덮을 때 %000x %n을 쓰기 때문에 magic_addr+2를 덮을 때는 magic_addr의 %n 다음에 %000x %n을 줘야하기 때문에다.
magic_addr을 덮을 경우,
45068 - (%magic_addr(4) + AAAA(4) + &magic_addr+2(4) + %08x 5개(40)) = 45016
%45016c %n 으로 줘야한다.
magic_addr+2를 0xface로 덮을 경우,
앞에 길이가 총 45068이므로 64206 - 45068 = 19138
%19138c %n 으로 줘야한다.
p32(magic_addr) + "AAAA" + p32(magic_addr+2) + "%08x%08x%08x%08x%08x" + "%45016c%n"
+ "%19138c%n"
이 payload가 된다.
2) pwntools의 fmtstr 사용
pwntools에서 format string bug를 exploit하기 위한 tool인 fmtstr 함수를 제공한다.
fmtstr_payload(offset, {addr: 0xdeadbeef})
이렇게 써서 사용
[Insomni'hack 2017] Wheel of Robots (0) | 2020.01.10 |
---|---|
[HITCON 2016] SleepyHolder (0) | 2020.01.08 |
[HITCON-Training] crack (0) | 2020.01.02 |
[Codegate2018] BaskinRobins31 (0) | 2020.01.01 |
simple_heap (0) | 2019.12.21 |