4번 문제인 orc 이다.

 

이번 문제는 argv에 커맨드라인으로 입력받고, strcpy로 buffer에 값을 복사한다.

저번 문제에서 사용했던 환경 변수도 environ에서 전부 제거하고 시작하기 때문에 사용할 수 없다.

그리고 argv[1]의 47번째 문자가 \xbf가 아니면 종료해버린다.

따라서 argv[2]에 쉘코드를 넣고, argv[1]에서는 buffer(40) + sfp(4) = 44만큼 더미값으로 덮고, buffer의 ret을 argv[2]의 주소로 덮으면 될 것이다.

우선은 argv[2]의 주소를 알기 위해 임의의 값을 적어볼건데, argv[1][47]이 \xbf이여야하니, 아예 \xbf로 덮어보자.

그리고 argv[2]를 a로 덮어서 argv[2]의 입력이 시작되는 곳을 찾아보자.

 

보다시피 argv[2]의 입력이 시작되는 곳은 0xbffffc3c라는 것을 알 수 있다.

이제 buffer(40) + sfp(4) = 44만큼 더미 값을 채우고, 0xbffffc3c를 리틀엔디안으로 넣고, 두 번째 커맨드라인으로 입력하는 값에는 nop sled 100바이트와 쉘코드를 넣어주자.

 

성공적으로 쉘을 땄다.

cantata

'Hacking > Pwnable' 카테고리의 다른 글

[LOB] 3번 - goblin  (0) 2020.08.16
[LOB] 2번 - cobolt  (0) 2020.08.16
[LOB] 1번 - gremlin  (0) 2020.08.10
Hackerschool FTZ - level9 write up  (0) 2019.09.21
Hackerschool FTZ - level8 write up  (0) 2019.09.18

3번 문제인 goblin 이다.

 

1, 2번에서는 argv에서 넘어온 인자값을 strcpy로 복사해서 buffer에 넣는 방식이었다.

이번에는 gets로 표준 입력으로 buffer에 입력을 받는다.

따라서 이전처럼 ` 를 이용하여 작성하지 않고, | 를 이용하여 작성한다.

파이썬으로 값을 출력한 후, cat으로 출력해주면 표준 출력으로 찍혀서 값이 넘어갈 것이다.

그 외의 공격 코드 형태 자체는 아까와 동일할 것이다.

 

환경변수의 주소는 0xbfffff09이다.

이제 buffer(16) + sfp(4) = 20만큼 더미값을 채우고, 0xbfffff09를 리틀엔디안으로 넣어주면 될 것이다.

 

성공적으로 쉘을 땄다.

hackers proof

'Hacking > Pwnable' 카테고리의 다른 글

[LOB] 4번 - orc  (0) 2020.08.18
[LOB] 2번 - cobolt  (0) 2020.08.16
[LOB] 1번 - gremlin  (0) 2020.08.10
Hackerschool FTZ - level9 write up  (0) 2019.09.21
Hackerschool FTZ - level8 write up  (0) 2019.09.18

2번 문제인 cobolt 이다.

 

1번 문제와 유사하나 buffer의 크기가 이번에는 16이다.

즉, NOP sled나 shellcode를 담기에는 작은 공간이다.

따라서 환경변수로 미리 쉘코드를 만들어두고, 그 환경변수의 주소를 buffer의 ret에 덮어주면 될 것이다.

 

환경변수를 만들 때는 export [환경변수이름], 제거할 때는 unset [환경변수이름]의 형태로 만들 수 있다.

환경변수에 shellcode를 담았으니, 이제 환경변수의 주소를 알아보자.

 

환경변수의 주소는 0xbfffff07이다.

이제 buffer(16) + sfp(4) = 20만큼 더미값을 채우고, 0xbfffff07을 리틀엔디안으로 넣어주면 될 것이다.

 

성공적으로 쉘을 땄다.

hacking exposed

'Hacking > Pwnable' 카테고리의 다른 글

[LOB] 4번 - orc  (0) 2020.08.18
[LOB] 3번 - goblin  (0) 2020.08.16
[LOB] 1번 - gremlin  (0) 2020.08.10
Hackerschool FTZ - level9 write up  (0) 2019.09.21
Hackerschool FTZ - level8 write up  (0) 2019.09.18

pwnable 9번 문제인 BOF_PIE 이다.

 

보아하니 매번 실행할 때마다 출력해주는 주소의 위치는 바뀌고, 우리한테 무언가 값을 입력받는다.

 

32bit elf 파일, NX-bit와 PIE가 걸려있다.

 

main문에서는 welcome 함수를 실행 후 Nah를 출력한다.

 

welcome 함수에서는 welcome의 주소를 출력하고, v1에 scanf로 입력을 받는다.

 

그리고 함수들 중 j0n9hyun이라는 함수가 있는데, 보아하니 flag를 출력해주는 함수이다.

PIE가 걸려있는것을 고려해보았을 때, 매 함수는 실행 할때마다 주소가 바뀌지만, 각 함수들의 offset은 동일할 것이다.

우리는 프로그램을 실행하면서 welcome의 주소를 알 수 있다.

따라서 현재 바이너리에서 j0n9hyun의 주소가 welcome의 주소로부터 얼마나 차이가 나는지를 통해 offset 크기를 알 수 있다.

 

0x909 - 0x890 = 0x79, 즉 offset 크기는 0x79이다.

자 그러면 우리가 입력을 받는 v1은 ebp-12h에 있으니, v1(18) + sfp(4) = 22, 22개의 더미데이터를 입력하고, 주어진 welcome 함수 - 0x79를 한 값을 ret에 써주면 j0n9hyun이 실행될 것이다.

익스코드를 짜보자.

 

성공적으로 익스플로잇이 된다.

Load of the BOF 문제를 풀어보기로 했다.

1번 문제인 gremlin 이다.

 

보아하니 argv에 입력받은 내용을 strcpy로 buffer에 복사하는 코드이다.

strcpy로 값을 복사하니 bof가 일어날 것이다.

buffer에 쉘코드를 넣고 ret 주소를 다시 buffer의 주소로 가리키면 될 것이다.

buffer의 사이즈는 256, sfp(4)를 더해 260칸이므로 쉘코드를 제외한 나머지 칸들을 NOP sled로 채워주면 될 것이다.

 

strcpy가 실행된 부분인 main+59에 bp를 걸고, A를 넣어서 어디서부터 buffer가 입력이 되는지 확인해보자.

 

보다시피 0xbffff918 부터 입력이 된다.

 

따라서 쉘코드가 깨지지 않게 적당히 NOP sled를 넣고, 쉘코드를 넣고, NOP sled를 다시 넣고 ret 주소를 0xbffff918로 적어주면 쉘코드가 실행될 것이다.

 

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80

 

쉘코드는 24바이트 쉘 코드를 사용할 것이다.

즉, 260 - 24 = 236 만큼 앞 뒤로 NOP sled를 써주자.

그리고 그 뒤의 ret 주소에 0xbffff918를 리틀엔디안 형식으로 넣어주면 될 것이다.

 

성공적으로 쉘을 땄다.

hello bof world

'Hacking > Pwnable' 카테고리의 다른 글

[LOB] 3번 - goblin  (0) 2020.08.16
[LOB] 2번 - cobolt  (0) 2020.08.16
Hackerschool FTZ - level9 write up  (0) 2019.09.21
Hackerschool FTZ - level8 write up  (0) 2019.09.18
Hackerschool FTZ - level7 write up  (0) 2019.09.18

pwnable 8번 문제인 Offset 이다.

 

이런식으로 실행이 되는데, 입력을 받는 다는 것 빼고는 잘 모르겠으니 바이너리를 한 번 보자.

 

32비트 elf파일, NX-bit가 걸려있으니 shell코드를 못 쓰고, PIE가 걸려있으니 매 타임 실행할 때마다 변수, 함수들의 오프셋 위치가 달라질 것이다. FULL RELRO라 GOT Overwrite도 못한다.

 

s에 입력을 받고, select_func라는 함수에 s를 넘겨준다.

 

select_func에서는 v3라는 함수포인터에 two라는 값을 넣어주고, dest에 넘겨받은 우리가 입력해준 값을 받고, 그 값이 one이면 v3를 one으로 바꿔준다.

 

두 함수는 정말 별거 없다.

 

함수 포인터에 값을 넣어서 실행하는 방식이니 v3를 뭔가로 덮어야한다고 생각했다.

그래서 함수들을 보니, 함수 중에 print_flag라는 함수가 있다.

 

flag를 출력해준다.

그말은 즉 v3의 값을 print_flag함수의 주소로 덮어쓴다면 flag가 출력될 것이다.

main에서 s는 gets로 입력을 받으니 BOF가 일어날 것이다.

select_func에서의 dest는 ebp-2Ah, v3는 ebp-Ch에 있으니, 0x2A - 0xC = 0x1E = 30(10) 이 된다.

즉, 우리는 더미값을 30칸 채워주고, print_flag의 주소를 쓰면 될 것이다.

익스코드를 짜보자.

 

성공적으로 익스플로잇이 된다.

pwnable 7번 문제인 Simple_Overflw_ver2 이다.

 

입력을 받고 그대로 출력을 해주는데, 위치는 0xffcd43b0 으로 고정되어 있는 것을 확인할 수 있다.

 

32비트 ELF 파일, 적용된 보호기법은 없다.

 

NX-bit도 없고 쉘을 주는 함수도 없다.

그리고 scanf로 s를 입력받으니 BOF 취약점이 있다.

또, s의 주소를 제공해주므로 s에 쉘코드를 넣고 더미값을 채워 ret을 다시 s의 주소로 덮으면 될 것s의  같다.

s가 ebp-88h이니 쉘코드를 넣고, 0x88 + 4(sfp) - 쉘코드의 길이 만큼 더미 값을 채워넣고, ret을 다시 s의 주소로 덮어써보자.

 

자 정리를 해보자.

1. scanf로 입력받아 BOF 취약점이 일어난다.
2. 매타임 입력할 때 s의 주소를 알려주므로 쓰레기값을 하나 넣어주고 주소값을 먼저 받는다.

3. s에 쉘코드(25byte)를 넣고 136(0x88)+4-25 = 115의 만큼 더미데이터를 넣어준다.

4. s의 ret에 s의 주소를 다시 넣자. 

 

좋아, 익스코드를 짜보자.

 

엄..

 

성공적으로 익스플로잇이 된다.

pwnable 6번 문제인 x64 Simple_size_BOF 이다.

 

buf의 위치를 출력해준다.

그리고 뭔가 입력을 받는거 같은데 아무런 변화도 일어나지는 않는다.

 

64비트 elf, 그리고 적용된 보호기법은 없다.

 

v4의 주소를 출력하고, v4에 입력을 받는다.

뭔가 쉘을 주는 다른 함수는 보이지 않는다.

v4는 rbp-6D30h, 즉, v4에 쉘코드를 넣고, 0x6D30 + 8(sfp) - 쉘코드의 길이 만큼 더미값을 채워넣어서 ret을 처음 제공해주는 v4의 주소를 넣으면 될 것이다.

좋아, 익스코드를 짜보자.

 

payload에 쉘코드는 31byte 짜리, v4_addr에 처음 제공해주는 v4의 주소를 저장한다.

그리고 0x6D30에 쉘코드 길이를 빼주고 sfp를 더한 뒤 ret에 v4_addr을 넣는다.

실행을 해보면..

 

성공적으로 익스플로잇이 된다.

pwnable 5번 문제인 x64 Buffer Overflow 이다.

 

입력을 받고 Hello와 내가 입력한 내용을 그대로 출력해준다.

 

제목 그대로 64비트 elf 파일이고, NX-bit가 걸려있으니 쉘코드를 실행 못하고, RELRO도 걸려있으니 got overwrite 도 못한다.

scanf로 s에 문자열 입력을 받는다.

더미값으로 채워서 ret을 덮을 수 있을 것이다.

그럼 ret에 넣을 뭔가 주소를 찾아야하는데..

callMeMaybe 함수가 보였다.

보다시피 쉘을 준다.

callMeMaybe 함수의 주소를 확인했다.

64비트 환경에서 sfp는 8바이트다.

그리고 s의 위치는 rbp-110h이다.

즉, s에 0x110 + 8(sfp) 만큼 더미데이터를 입력하고, callMeMaybe 함수의 주소로 ret을 덮어쓰면 될 것이다.

0x110 = 272(10)

272 + 8 = 280

p callMeMaybe = 0x400606

익스코드를 짜보자.

 

성공적으로 익스플로잇이 된다.

pwnable 4번 문제인 내 버퍼가 흘러넘친다!!! 이다.

 

이름이랑 뭔가 입력을 받는다.

prob1를 한번 보자.

 

딱히 적용된 보호기법은 없다.

 

main문에서 name에 read로 0x32만큼 입력을 받는다.

그리고 다시 s에 gets로 입력을 받는다.

NX-bit가 적용되어 있지 않으니 name에 쉘코드를 입력하고, s에 BOF를 일으켜 name을 실행할 수 있을 것 같다.

name의 주소를 확인해보자.

 

0x0804A060이다.

즉 처음 입력에 0x32 크기보다 작은 쉘코드를 넣고, s에서 0x14 + 4(sfp)만큼 더미값으로 덮은 뒤 s의 ret을 name의 주소 0x0804A060로 덮어써서 BOF가 일어나도록 할 수 있을 것이다.

익스코드를 짜보자.

 

쉘코드는 25byte 짜리를 가져다 썼다.

실행을 해보면..

 

성공적으로 익스플로잇이 된다.

'HackCTF > Pwnable' 카테고리의 다른 글

[HackCTF] Pwnable - x64 Simple_size_BOF  (0) 2020.07.08
[HackCTF] Pwnable - x64 Buffer Overflow  (0) 2020.07.08
[HackCTF] Pwnable - Basic_FSB  (0) 2020.07.03
[HackCTF] Pwnable - Basic_BOF #2  (0) 2020.06.25
[HackCTF] Pwnable - Basic_BOF #1  (0) 2020.06.25

+ Recent posts