
1. LUA란
1) LUA
1993년 브라질의 Pontifical Catholic University of Rio de Janeiro에 의해 개발된 스크립트 언어
확장성과 이식성이 뛰어나며, 주로 다른 애플리케이션에 내장되어 사용됨.
파이썬과 비슷한 간단한 문법과 높은 성능을 갖추고, 동적 타입을 지원하며 메모리 관리가 자동으로 이루어짐.
2) LUA 의 주사용처
주로 게임 개발, 임베디드 시스템, 웹 애플리케이션, 데이터 처리 분야에서 사용
네트워크 장비의 스크립팅 언어, Redis와 같은 데이터베이스에서도 사용됨.
2. LUA 문법
강의
https://www.youtube.com/watch?v=tiJlxyGumS0&t=51s
1) 변수: 범위/Type
- 전역 변수 & 지역 변수
Var1 = 10 -- 전역 변수
local Var2 = 20 -- 지역 변수
- 타입
number
local num = 42 -- 정수
local pi = 3.14 -- 실수
str
local str = "Hello, Lua!"
nil: 값이 없음
local empty = nil
boolean
local isTrue = true
local isFalse = false
table
local tbl = {1, 2, 3, name = "Lua", version = 5.4}
function
local function add(a, b)
return a + b
end
number, string, nil, boolean, table, function 형 존재
2) 연산자: Operation
- 산술 연산자: +, -, *, /, %, ^ (거듭제곱)
- 비교 연산자: ==, ~=, <, >, <=, >=
- 논리 연산자: and, or, not
- 문자열 연산자: .. (문자열 연결)
- #: 배열 (테이블의 갯수)
local a={"hi","hello"}
print(a[1].."---"..a[2])
print(#a)
실행
hi---hello
2
3) 반복문: while,for
a=10
while(a<20)
do
print("value of a:", a)
a=a+1
end
while 다음에 오는 조건이 참이 될 때까지 do~end사이를 계속 실행
for i=10,20,1
do
print(1)
end
i 처음 값이 두 번째 값이 될 때까지 세 번째값을 처음 값에 더한다.
4) 조건문: if
local x = 10
if x > 5
then
print("x는 5보다 큽니다.")
elseif x == 5 then
print("x는 5입니다.")
else
print("x는 5보다 작습니다.")
end
5) 함수
local function hihi(a, b)
print("hihihi")
return 123
end
hihi()
print(type(hihi))
print(hihi)
print(hihi())
출력
hihihi
function
function:0x5595d4e1b0b0
hihihi
123
6) String
local str = "Hello, Lua"
print(string.upper(str)) -- 출력: HELLO, LUA
print(string.sub(str, 1, 5)) -- 출력: Hello
print(string.format("%.3f",1/3)) -- 출력: 0.333
print(string.rep("WHAT! ",100)) -- 출력 : WHAT! 100번 출력..
7) Array
aa={} -- 테이블형임!
print(type(aa)) -- 출력 : table
aa={"a", "b", "c", "d"}
print("size : "..#aa) -- 출력 : 4
for i=1, #aa do
print(aa[i])
end
-- 출력 :
a
b
c
d
aa={1,2,3,4}
print("size : "..#aa) -- 출력 : 4
for i=1, #aa do
print(aa[i])
end
-- 출력 :
1
2
3
4
8) Table/Iterator
m_array={}
for i=1,10 do
m_array[i]={}
for j=1, 10 do
m_array[i][j]=i*j
end
end
for i=1, 10 do
for j=1, 10 do
print("["..i.."]["..j.."]"..m_array[i][j])
end
end
-- 출력:
[1][1]1
[1][2]2
.
.
.
[1][10]10
[2][1]2
.
.
3. LUA에서 발생할 수 있는 취약점
1) CVE-2024-31449
(1) 취약점 개요
발생한 소프트웨어: Redis
유형: 스택 버퍼 오버플로우 취약점으로 인한 원격 코드 실행 공격 가능성
(2) 취약점 발생 코드
lua 라이브러리의 bit.tohex() 2개의 인자를 받고 첫번째 인자를 hex string 으로 변환한다. 두 번째 인자는 결과로 반환할 hex string의 자리수를 정한다.
만약 두 번째 인자에 음수가 들어가면 스택 버퍼오버플로우로 이어질 수 있고, Redis에서는 이에 대해 검증하지 않아서 위와 같은 문제가 발생했다.
(3) 패치

INT32_MIN = -2147483648
만약, n이 -2147483648이면 -2147483647로 바뀜
- INT32_MIN을 계산했을 때 부호 있는 정수 오버플로우(UB) 발생하는 것을 막기 위함
'이예은' 카테고리의 다른 글
| plt와 got (0) | 2025.01.31 |
|---|---|
| 파일 시그니처 분석 (0) | 2024.11.15 |
| Bindiff 활용해서 Binary Diffing하기 (0) | 2024.11.01 |

stellarflare 님의 블로그 입니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!