을지문덕은 가문의 내력이 자세히 전해지지 않는다. 그는 자질이 침착하고 용맹스러우며 지모가 있었고 동시에 글도 지을 줄 알았다.
수 나라 개황 연간에 양제가 조서를 내려 고구려를 공격하자, 좌익위 대장군 우문술은 부여도로 나오고 우익위 대장군 우 중문은 낙랑도로 나와서 9군과 함께 압록강에 이르렀다.
문덕이 왕의 명을 받들고 적진으로 가서 항복하는 체하였으나, 이는 사실 그들의 허실을 보려는 것이었다. 술과 중문은 이 보다 앞서 황제의 비밀 교지를 받았었다. 이에는 고구려의 왕이나 문덕을 만나거든 체포하라고 쓰여 있었다. 이에 따라 중문 등은 문덕을 억류하려 하였는데, 위무사로 있던 상서 우승 유 사룡이 굳이 말리는 바람에 결국 문덕이 돌아가는 것을 허락하였다. 그 뒤에 이를 깊이 후회하여 사람을 보내 문덕을 속여서 말하기를 “재차 의논할 일이 있으니 다시 오라”고 하였으나, 문덕은 돌아보지도 않은 채 압록강을 건너왔다. 술과 중문은 문덕을 놓친 뒤에 마음 속으로 불안하게 생각하였다.
(우문)술은 군량이 떨어졌다 하여 돌아가려 하는데, (우)중문은 정예부대로 문덕을 추격하면 공을 이룰 수 있다고 주장하였다. 술이 이를 말렸다. 중문이 화를 내어 말했다. “장군이 10만의 병력을 가지고 와서 조그마한 적을 격파하지 못하고 무슨 낯으로 황제를 뵈옵겠는가?” 술 등은 마지못하여 그 말을 따라 압록강을 건너서 문덕을 추격하였다.
(을지)문덕은 수군에게 굶주린 기색이 있음을 보고, 그들을 피로하게 하기 위하여 싸울 때마다 매번 패배한 척하며 도주하였다. 이렇게 하여 술은 하룻 동안에 일곱 번을 싸워 모두 승리하였다. 그들은 갑작스러운 승리에 뱃심이 생기기도 하고, 또한 중의에 몰리기도 하여, 마침내 동쪽으로 나아가 살수를 건너 평양성 30리 밖에서 산을 등지고 진을 쳤다.
문덕이 중문에게 다음과 같은 시를 보냈다.
“신기한 계책은 천문에 통달했고,
묘한 계략은 땅의 이치를 알았도다.
전투마다 이겨 공이 이미 높았으니,
만족한 줄 알았으면 돌아가는 것이 어떠하리.”
중문이 답서를 보내 효유하였다.
문덕이 또한 사자를 보내 항복을 가장하고 술에게 요청하였다.
“만일 군사를 철수한다면 틀림없이 왕을 모시고 행재소로 가서 조견하겠다.”
술은 군사들이 피곤하고 기운이 쇠진하여 더 이상 싸울 수 없을 뿐만 아니라, 평양성은 험하고 견고하여 갑자기 함락시키기는 어려울 것이라고 판단하여, 거짓 항복이라도 받은 상태에서 돌아가기로 결정하고 방어진을 만들며 행군하였다.
문덕이 군사를 출동시켜 사면으로 공격하니 술 등이 한편으로 싸우며 한편으로는 쫓겨 갔다. 그들이 살수에 이르러 군사가 절반쯤 강을 건너 갔을 때, 문덕이 군사를 몰아 그들의 후군을 맹공하여 우둔위장군 신 세웅을 죽였다. 이렇게 되자 모든 적군이 한꺼번에 허물어져 걷잡을 수가 없었다. 9군 장졸이 달려서 패주하였는데, 하루낮 하루밤 사이에 압록강에 이르니 그들은 4백 50리를 간 셈이다. 처음 요수를 건너 올 때 그들은 9군 30만 5천 명이었는데, 요동성에 돌아갔을 때는 다만 2천7백 명뿐이었다.
(김부식은) 말한다
양제의 요동 전역은, 출동 병력이 전례가 없을 만큼 거대하였다. 고구려가 한 모퉁이에 있는 조그마한 나라로서 능히 이를 방어하고 스스로를 보전하였을 뿐만 아니라 그 군사를 거의 섬멸해버릴 수 있었던 것은 문덕 한 사람의 힘이었다. 전에 이르기를 “군자가 없으면 어찌 나라를 다스릴 수 있으리오?”[「춘추좌전」]라고 하였는데 참으로 옳은 말이다.