20 코인
질문입니다
익스플로잇 코드를 작성하다가 궁금한 점이 생겨서 질문합니다
강의를 보고 어찌저찌 코드를 작성한 후 실행 했더니
이런식으로 출력이 됩니다
어딘가를 잘못했나 해서 코드를 살펴봤으나
어디가 잘못되었는지를 몰라서정답코드를 참고했습니다
저의 코드에는 이 부분이 빠져있더라고요
그래서 이 부분을 추가하니 셸을 획득하는데 성공했습니다
왜 이런 현상이 발생했는지 궁금합니다
#pwnable
작성자 정보
답변
1
전체적인 익스플로잇 코드를 알 수 없지만 혹시 제 답변이 도움이 될 수 있을지 몰라 남겨봅니다.
우선 문제 코드를 살펴보면
// 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: "); <-------------- 1 번째 Buf 출력
read(0, buf, 0x100);
printf("Buf: %s\n", buf); <----- 2 번째 Buf 출력
// Overwrite return address
printf("[2] Overwrite return address\n");
printf("Buf: "); <-............. 3 번째 Buf 출력
read(0, buf, 0x100);
return 0;
}
세 번의 Buf 출력 중 과정 [1], [2]에 해당하는 read 함수에 payload를 각각 1, 3번째에 해당하는 Buf 출력 이후에 send해야하는 것을 알 수 있습니다.
올려주신 익스플로잇 코드 위를 살짝 보니까 sendafter(b"Buf: ", payload) 형태인 것을 보아
정답코드의 p.recvuntil(buf)를 생략하게되면 2 번째 Buf 출력 이후 즉 read(0, buf, 0x100)가 호출되기 전에 과정 [2]의 payload가 전송되어 익스가 깨진 것 같습니다.
추후 익스 중 원하는 recv, scanf에 대응하는 payload를 전송하기 위해서 recv관련 함수를 잘 활용하시기 바랍니다.
recvuntil(delims, drop=False, timeout=default) → bytes[source]
Receive data until one of delims is encountered.
If the request is not satisfied before timeout seconds pass, all data is buffered and an empty string ('') is returned.
연휴 잘보내시고 화이팅~~!